0

この mysql クエリの最適化、またはこの mysql クエリを作成する他の方法を教えてください。実行できますが、時間がかかりすぎます。

SELECT DISTINCT
    A.item1,
    A.item2,
    A.item3,

FROM tableAA AS A
INNER JOIN(tableBB AS B)
ON(A.item4 = B.item4)
INNER JOIN(tableCC AS C)
ON(A.item4 = C.item4)
INNER JOIN(tableDD AS D)
ON(A.item4 = D.item4)
WHERE (B.item5 = '$selected1' AND
  B.item6 LIKE '%$selected2%' AND
  C.item7='$selected3' ) OR
  (A.item8 LIKE '%$selected2%' AND
D.item5 = '$selected1' AND
 C.item7='$selected3')

このクエリを書く他の方法はありますか?

編集: tableAA & tableBB & tableCC には数十億のエントリが含まれています。テーブルを正しくインデックス付けしたと思います。

edit2: しかし、問題は Like % 状態ではないと思います。私はそれをオフにして、もう一度クエリを実行しました。それでも565秒ほどかかります。

4

1 に答える 1

2

やるべきことがいくつかあります。

1) テーブル A、B、C、D の item4 にインデックスを付けます。一般に、インデックスは読み取り (wheres と結合) を高速化し、書き込みを遅くします。

2)多くのストレートな「where」を実行する列にインデックスを付けます-B.item5など。ただし、インデックスが「like」マッチングで何も変更しないB.item6ではありません。

3) この最後のものはもっと時間がかかりますが、「%$key%」のように検索する必要がある場合は非常に重要です。これらは非常に時間がかかるためです。列内のすべての文字列のほぼすべての文字が検索文字列と比較されます。 : B.item6 および A.item8 の検索キーワードがリストされ、索引付けされ、それらを検索するテーブルを作成します。そうすれば、これらの列で二分探索が可能になります。これは大きな変化です。

======== 編集: インデックス作成が完了したと言うので、上記のポイント 3 について詳しく説明します。============

検索するテーブルが 1 つあるとします。

table A
-------
k (PK)
s (big string)

そして、あなたがしたい:

select k
from A
where s like '%$keyword%'

s は長い文字列であるため、未知の場所で s が出現するたびにキーワードを検索すると、非常に時間がかかります。

そこで、もう 1 つのテーブルを作成します。

table s_words
-------------
word | (PK)
k *  |

s_words は、s で見つかった単語のリストであり、テーブル A で対応する行を見つけるためのキーを持ちます。各単語は、テーブル内で複数回出現します。s_words に入力するには、s 内のすべての文字列を取得して解析し、各単語をテーブルに追加する必要があります。

クエリは次のとおりです。

select k
from s_words
where word = '$keyword'

単語にインデックスを付けることができるようになりました。文字列を文字ごとにユーザー キーワードに一致させる必要はありません。

于 2013-09-18T19:40:24.737 に答える