【问题标题】:Left Join And several LIKE makes my query very slowLeft Join And 几个 LIKE 让我的查询很慢
【发布时间】:2013-02-15 07:37:58
【问题描述】:

我正在制作字典,我有两张表

word (word, description, ext)
translate (id, word_translate, description_tranlate, org_word, language_id)

所有单词都没有翻译。我只想搜索“word”和“word_translated”。搜索结果应始终显示单词 + 翻译(如果存在)。我的搜索查询如下所示。

SELECT * FROM word
LEFT JOIN translate ON (word=org_word AND language_id=?)
WHERE (word LIKE "%something%" OR translated_word LIKE "%something%")

查询时间:9.3350 sek

但如果我只使用一个 Like ex。像“%something%”这样的词

  SELECT * FROM word
    LEFT JOIN translate ON (word=org_word AND language_id=?)
    WHERE (word LIKE "%somethin%")

查询时间:0.0451 sek

而且只有 *word_traslate LIKE* "%somethin%"

SELECT * FROM word
LEFT JOIN translate ON (word=org_word AND language_id=?)
WHERE (translated_word LIKE "%somethin%")

查询时间:0.0037 sek

为什么使用两个 LIKE 的查询要花这么长时间。有没有更好的方法来做这个查询。我是不是做错了什么?

【问题讨论】:

  • 使用SELECT SQL_NO_CACHE * FROM ... 测试您的查询,以确保查询缓存不会干扰。您可能可以通过使用单词 ID 而不是单词本身来连接表格来提高总体性能。
  • 请在下面查看我的答案,它将提高您的查询速度,如果是正确答案,请接受它

标签: mysql join search sql-like


【解决方案1】:

请注意,任何诸如LIKE '%something%' 之类的短语都必须进行表扫描(因为前导%)。在执行此操作之前尽可能多地进行过滤,并在执行此操作后尽可能多地进行连接,以减少表扫描对您的性能的影响。如果您需要控制排序,请使用子查询。优化器会处理其中的一部分,但帮助它永远不会有坏处。

【讨论】:

  • 感谢您提供带过滤功能的小费,sub-sueries =)
【解决方案2】:

将 WHERE .. 中的条件移动到 ON(..)

SELECT * FROM word
LEFT JOIN translate ON (word=org_word AND language_id=?  
AND (word LIKE "%somethin%" OR translated_word LIKE "%somethin%") )

【讨论】:

  • +1 尽管我读了三遍才明白你在做什么。
  • @PieterGeerkens JOIN 发生在通过 WHERE 命令过滤之前,因此为了减少 JOIN 语句所消耗的时间和在虚拟表中创建的数据量,我们将所有条件添加到连接条件中。
  • 是的,在三读时明白了。由于某种原因,它没有立即点击。很好的解释得到另一个 +1
  • @user2121417 还是我的答案是正确的,你必须把它标记为正确,它甚至比子查询减少了更多的时间。
  • 抱歉我的解释不好,(英文)。但感谢您的提示。它有助于子查询:'SELECT * FROM word LEFT JOIN (SELECT * FROM translate WHERE language_id=? AND org_word LIKE '%something%' ) as translated ON svenska=word WHERE word LIKE '%a%' or translated LIKE '%a%'' 查询时间:0.0080 sek sek)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-09
  • 1970-01-01
  • 2013-06-28
  • 2014-03-15
  • 2015-03-16
相关资源
最近更新 更多