如果我仍然使用MySQL而不是MySQLI,请道歉。将很快升级,但目前我需要找到解决这个问题的方法。
我有一个我认为已经优化的查询,显然不是。
我在fruits表中的行少于200行,但查询大约需要15秒才能完成
以下是查询:
SELECT `o`.`fruits_id` FROM `fruits` as `o`
JOIN `fruits_categories` as `oc` ON `o`.`fruits_id` = `oc`.`fruits_id`
JOIN `categories` as `c` ON `c`.`fru_id` = `oc`.`fru_id`
WHERE ( (o.fruits_name LIKE '%apple orange%' OR o.fruits_description LIKE '%apple orange%' OR o.instagram_tag LIKE '%apple orange%' OR c.cat_name LIKE '%apple orange%' OR p.price_name LIKE '%apple orange%')
OR ((o.fruits_name LIKE '%apple%' OR o.fruits_description LIKE '%apple%' OR o.instagram_tag LIKE '%apple%' OR c.cat_name LIKE '%apple%' OR p.price_name LIKE '%apple%')
AND (o.fruits_name LIKE '%orange%' OR o.fruits_description LIKE '%orange%' OR o.instagram_tag LIKE '%orange%' OR c.cat_name LIKE '%orange%' OR p.price_name LIKE '%orange%')) )
GROUP BY `o`.`fruits_id`
我担心当数据库增长时,搜索将无法使用,因为它可能需要永远。
所有帮助表示赞赏。
乙
答案 0 :(得分:1)
LIKE '%apple orange%'
条件都是不必要的,它们由单个单词的条件涵盖。like '%whatever%'
条件无法使用索引。考虑在受影响的列上创建fulltext index并使用match(...) against(...)全文搜索而不是like
运算符进行模式匹配。答案 1 :(得分:0)
什么减慢了这个查询的速度是“LIKE”
搜索'%apple orange%'或('%apple%'和'%orange%')也有点多余删除'%apple orange%'搜索。
答案 2 :(得分:0)
随着时间的推移,%phrase%
等问题一定会遇到性能问题。请注意,对于不以%
开头的查询,您可以使用B树索引。
所以你有几个选择:
%
开头(如果您的应用允许)并使用B树索引。更多信息:http://dev.mysql.com/doc/refman/5.7/en/index-btree-hash.html