Mysql 左连接和几个类似的连接使我的查询非常慢

Mysql 左连接和几个类似的连接使我的查询非常慢,mysql,join,search,sql-like,Mysql,Join,Search,Sql Like,我在编字典,我有两张桌子 word (word, description, ext) translate (id, word_translate, description_tranlate, org_word, language_id) 所有单词都没有翻译。我只想搜索“word”和“word\u translated”。搜索结果应始终显示word+translated(如果存在)。我的搜索查询如下所示 SELECT * FROM word LEFT JOIN translate ON (wor

我在编字典,我有两张桌子

word (word, description, ext)
translate (id, word_translate, description_tranlate, org_word, language_id)
所有单词都没有翻译。我只想搜索“word”和“word\u translated”。搜索结果应始终显示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瑞典克朗

但如果我只使用一个类似的词,例如%something%

  SELECT * FROM word
    LEFT JOIN translate ON (word=org_word AND language_id=?)
    WHERE (word LIKE "%somethin%")
查询时间:0.0451瑞典克朗

而且只有像这样的单词

SELECT * FROM word
LEFT JOIN translate ON (word=org_word AND language_id=?)
WHERE (translated_word LIKE "%somethin%")
查询时间:0.0037瑞典克朗


为什么两个LIKE的查询时间要长得多。有没有更好的方法来做这个查询。我做错了什么吗?

请注意,任何短语(如“%something%”)都会因为前导的%而进行表扫描。在执行此操作之前尽可能多地进行过滤,并在执行此操作之后尽可能多地进行连接,以减少表扫描对性能的影响。如果需要控制排序,请使用子查询。优化器会处理其中的一些问题,但帮助解决这些问题不会有什么坏处。

将条件移动到。。在……上

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

使用从中选择SQL\u NO\u CACHE*测试您的查询。。。以确保查询缓存没有干扰。通过使用word ID而不是word本身来加入表,您可能会提高总体性能。请检查我下面的答案,这将提高您的查询速度,如果答案正确,请接受+1,即使在我理解您所做的事情之前,我已经读了三遍。@PieterGeerkens连接发生在通过WHERE命令进行过滤之前,因此,为了减少所消耗的时间和为JOIN语句在虚拟表中创建的数据量,我们将所有条件添加到JOIN条件中。由于某种原因,它没有立即点击。好的解释会得到另一个解释+1@user2121417但是我的答案是正确的,你必须把它标记为正确的,这比子查询更节省时间。对不起,我的错误解释,英语。但是谢谢你的提示。它有助于子查询:“从word左侧选择*从translate WHERE language_id=”加入选择*?和在svenska=word上翻译的像“%something%”这样的组织单词,其中像“%a%”这样的单词或翻译成“%a%”这样的单词查询时间:0.0080 sek sekThanx,用于带有筛选、子问题的提示=