【问题标题】:How to fix mysql full-text index is too slowmysql全文索引过慢如何解决
【发布时间】: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 TableREPAIR TABLE keyword Table QUICK 但结果相同。我还需要做什么?

【问题讨论】:

  • 桌子有多大? innodb_buffer_pool_size 的值是多少?查询返回了多少行?
  • ngram_token_size=1 似乎很低。你为什么使用那个值?
  • @RickJames 大约 460000 条数据,池大小为 268435456!
  • @RickJames 我使用该表进行搜索。这是为了甚至可以搜索一个字符。

标签: mysql full-text-search


【解决方案1】:

正在搜索单个字符...

SELECT keyword from keywordTable WHERE keyword LIKE '%a%';

可能是最快的。它将不得不扫描整个表,并且不能使用任何类型的索引。

用“ngram”做等价的是大概较慢——它必须扫描索引的一大块,然后(随机地)进入数据以获得实际的keyword

考虑ngram_token_size=2(并重建索引)并执行上面的 LIKE(对于 1 个字符的搜索)或执行您拥有的 FULLTEXT(对于 2+)。

然后将 (ngram=2) 与等效的 LIKE 进行比较:

SELECT keyword from keywordTable WHERE keyword LIKE '%aa%';

可能您也不应该将 ngram 用于“2”。

【讨论】:

  • 谢谢你的答案!你是说设置 ngram_size = 2,匹配 3 个字符,并使用 like 搜索 2 个字符或更少?
猜你喜欢
  • 2021-09-04
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2011-02-07
  • 2017-03-13
  • 2014-10-07
相关资源
最近更新 更多