提问人:Ryan 提问时间:7/21/2022 最后编辑:Ryan 更新时间:7/28/2022 访问量:68
MySQL MATCH查询速度提升
Speed improvements of MySQL MATCH query
问:
试图看看是否有一种方法可以加快我为我一直在使用的使用“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 条记录。但每次都需要几秒钟 - 希望我能把它调低一点。
如果有帮助,这是表格结构......
不确定我是否正确设置了索引,或者是否更改了表类型?或者,在我查询匹配项之前,也许查询并获取符合区域设置条件的结果(或者它可能已经在做那部分了......
提前感谢您的任何见解。
----更新-----
根据 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 时 - 我明白了
答:
将“HAVING”更改为“WHERE”,并在 WHERE 中重复 MATCH。
HAVING 直到以后才完成;你需要它在什么时间发生。
如需进一步讨论,请提供EXPLAIN SELECT ...
评论
ENGINE=InnoDB
... AGAINST("sqw blades" IN BOOLEAN MODE) ...
最终通过将描述字段从 varchar 切换到文本来显着加快速度。昼夜差。不知道为什么...... - 但我会接受的!
评论