【发布时间】:2022-11-18 10:05:27
【问题描述】:
我从本地环境搬到了aws的rds环境。
innodb_ft_enable_stopword=0
ngram_token_size=1
我有以上两个设置。
CREATE TABLE `keywordTable` (
`id` int NOT NULL AUTO_INCREMENT,
`createdAt` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
`updatedAt` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6),
`userId` int DEFAULT NULL,
`keyword` text NOT NULL,
PRIMARY KEY (`id`),
KEY `FK_2dd7820158cdf3dsasf` (`userId`),
FULLTEXT KEY `IDX_e89f81c42dswdfdf` (`keyword`) /*!50100 WITH PARSER `ngram` */ ,
CONSTRAINT `FK_2dd7820158c24303eb9f6618b9f` FOREIGN KEY (`userId`) REFERENCES `user` (`id`) ON DELETE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=947181 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
该表是使用上面的查询创建的。
SELECT keyword from keywordTable where MATCH(keyword) AGAINST('+aa' in boolean mode);
上面的查询需要将近一分钟的时间。连explain都需要4秒多,结果如下。
| left | center | right |
|---|---|---|
| One | Two | Three |
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | SIMPLE | keywordTable | fulltext | IDX_e89f81c42dswdfdf | IDX_e89f81c42dswdfdf | 0 | const | 1 | 100.00 | Using where; Ft_hints: no_ranking |
我也试过 optimize table keyword Table 和 REPAIR TABLE keyword Table QUICK 但结果相同。我还需要做什么?
【问题讨论】:
-
桌子有多大?
innodb_buffer_pool_size的值是多少?查询返回了多少行? -
ngram_token_size=1似乎很低。你为什么使用那个值? -
@RickJames 大约 460000 条数据,池大小为 268435456!
-
@RickJames 我使用该表进行搜索。这是为了甚至可以搜索一个字符。