改进MySQL查询

时间:2016-02-05 06:36:16

标签: mysql database query-optimization

如果我仍然使用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`

我担心当数据库增长时,搜索将无法使用,因为它可能需要永远。

所有帮助表示赞赏。

3 个答案:

答案 0 :(得分:1)

  1. 所有LIKE '%apple orange%'条件都是不必要的,它们由单个单词的条件涵盖。
  2. like '%whatever%'条件无法使用索引。考虑在受影响的列上创建fulltext index并使用match(...) against(...)全文搜索而不是like运算符进行模式匹配。

答案 1 :(得分:0)

什么减慢了这个查询的速度是“LIKE”

搜索'%apple orange%'或('%apple%'和'%orange%')也有点多余删除'%apple orange%'搜索。

答案 2 :(得分:0)

随着时间的推移,%phrase%等问题一定会遇到性能问题。请注意,对于不以%开头的查询,您可以使用B树索引。 所以你有几个选择:

  1. 尝试重写您的查询,以便搜索字词不以%开头(如果您的应用允许)并使用B树索引。更多信息:http://dev.mysql.com/doc/refman/5.7/en/index-btree-hash.html
  2. 试用全文索引 https://dev.mysql.com/doc/refman/5.7/en/fulltext-search.html 请注意,早期版本的InnoDb表是不可能的。但是如果你的桌子继续快速增长,那么你迟早会遇到麻烦。
  3. 最具扩展性的方法是将此匹配逻辑移动到专门为此目的而设计的第三方应用程序(如http://sphinxsearch.com/)。