我正在制作一本字典,我有两张桌子
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
但如果我只使用一个像前。喜欢“%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。有没有办法进行此查询。我做错了吗?
答案 0 :(得分:3)
将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 :(得分:0)
请注意,任何短语如LIKE '%something%'
都必须进行表扫描(因为前导%
)。在执行此操作之前尽可能多地进行过滤,并在执行此操作后尽可能多地进行连接,以减少表扫描对性能的影响。如果需要控制排序,请使用子查询。优化器会选择其中的一部分,但从来没有帮助它。