1

我正在制作字典,我有两张桌子

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 的查询需要更长的时间。有没有更好的方法来做这个查询。难道我做错了什么?

4

2 回答 2

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%") )
于 2013-02-28T22:35:49.257 回答
0

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

于 2013-02-28T22:35:14.350 回答