MySQL MATCH查询速度提升

Speed improvements of MySQL MATCH query

提问人:Ryan 提问时间:7/21/2022 最后编辑:Ryan 更新时间:7/28/2022 访问量:68

问:

试图看看是否有一种方法可以加快我为我一直在使用的使用“MATCH”的网站构建的查询

$r=$this->query("SELECT product_id,`locale`,
       MATCH (description) AGAINST ('".$keyword."') as matches,
       description
   FROM search_index
   HAVING matches>0
      AND locale='".$locale."'
   ORDER BY matches DESC limit ".$limit);

基本上,我正在查询一个包含少量列的表,其中包含大约 6000 条记录。但每次都需要几秒钟 - 希望我能把它调低一点。

如果有帮助,这是表格结构......

enter image description here

不确定我是否正确设置了索引,或者是否更改了表类型?或者,在我查询匹配项之前,也许查询并获取符合区域设置条件的结果(或者它可能已经在做那部分了......

提前感谢您的任何见解。

----更新-----

根据 Rick 的反馈提供更多信息

我尝试根据您的反馈进行修改。 这是一个原始的sql

SELECT product_id,locale, MATCH (description) AGAINST ('saw blade') as matches, description FROM search_index HAVING matches>0 AND locale='en_us' ORDER BY matches DESC

我根据您的反馈进行了修改(虽然 - 可能不正确!

SELECT product_id,locale, MATCH (description) AGAINST ('saw blade') as matches, description FROM search_index WHERE MATCH (description) AGAINST ('saw blade') AND locale='en_us' ORDER BY matches DESC

不幸的是,它们都需要大约相同的时间来执行(大约 6-7 秒)。

当我在后一个查询上尝试 EXPLAIN 时 - 我明白了

enter image description here

MySQL 性能 匹配

评论


答:

0赞 Rick James 7/21/2022 #1

将“HAVING”更改为“WHERE”,并在 WHERE 中重复 MATCH。

HAVING 直到以后才完成;你需要它在什么时间发生。

如需进一步讨论,请提供EXPLAIN SELECT ...

评论

0赞 Ryan 7/22/2022
谢谢。根据您的反馈更新了问题
0赞 Rick James 7/22/2022
嗯......重写的查询看起来“正确”。是表吗?(我认为这并不重要。表中有多少行?有多少行带有“锯片”?试试这个:ENGINE=InnoDB... AGAINST("sqw blades" IN BOOLEAN MODE) ...
0赞 Ryan 7/23/2022
是的,该表是 InnoDB..尝试添加“在布尔模式下”,查询似乎需要大约 2 倍的时间来运行(大约 12 秒对 6 秒)。表中大约有 6600 条记录,查询当前返回其中的 450 条。
0赞 Ryan 7/28/2022 #2

最终通过将描述字段从 varchar 切换到文本来显着加快速度。昼夜差。不知道为什么...... - 但我会接受的!