2

MySQL(すべてInnoDB)からユーザーとその場所などを選択する次のクエリがあります。テーブルuserには、それぞれ約 2mil の行があり、約 250、約 3500、およびblocked_user約2.8mil です。blocked_countriescountriesregionscities

AND co.country_id='us'問題は、WHERE句なしでクエリが非常に高速 (0.05 秒)であることです。しかし、私はいろいろ試してみましたが、このクエリにはもっと簡単で良い方法があるに違いないと感じています。

私は何が欠けていますか?どんな助けでも大歓迎です!事前にどうもありがとうございました!

4

2 に答える 2

2

またよろしくお願いいたします。最後に、問題を解決する方向を見つけました。パフォーマンスの問題は、主に範囲スキャンとORDER BY ... LIMIT.

したがって、私はインデックス作成について (私にとっては初めて) 多くのことを学び、範囲スキャン (私の場合は x と y の間の年齢のように) がある場合、範囲列は連結インデックスの最後でなければならないことを発見しました。インデックスを完全に使用することはできません。さらに、結果の並べ替えに使用される列は、インデックスの最後でなければなりません。したがって、範囲スキャンと が混在ORDER BYしている場合は、インデックスを使用して並べ替えを行うか選択するかを決定する必要があります。

私の場合、それはいくつかのインデックスに対していくつかの適切な組み合わせを考えることを意味します。並べ替えられる残りの行が非常に少ない場合、または検索をいくつかの行に絞り込むことができない場合は、並べ替えに使用される別のインデックスを次のように使用します。クエリは、 で指定された行数をすばやく見つけますLIMIT

于 2012-06-13T14:16:46.423 に答える
1

country_idのWHEREをHAVINGに変更してみてください

AND birthdate <=  '802726152'
AND birthdate >=  '676495752'

ORDER BY u.id DESC
HAVING co.country_id='us'
LIMIT 20
于 2012-06-10T13:36:56.267 に答える