1

私は辞書を作っていて、2つのテーブルがあります

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 秒

しかし、私が1つしか使用しない場合は、例のように。「%something%」のような単語

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

クエリ時間: 0.0451 秒

*word_traslate LIKE* "%somethin%" のみ

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

クエリ時間: 0.0037 秒

2 つの 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 に答える