2016-08-04 4 views
-1

diduidおよびpidの列を持つmy_tableという名前のテーブルがあります。このテーブルの インデックスは、次のとおりです。MySQLはどのようにインデックスを選択しますか?

  • (uid, did, pid) - ユニーク
  • (did)
  • (did, pid)

今、私はこのようになりますクエリがあります。これは、my_tableから

SELECT *をWHERE did = 1234

このクエリーは〜12秒で〜150k行に一致します。最後のインデックスを削除すると1秒以内に終了します

誰かが何が起こっているのか説明できますか?

+2

エッジケースのように聞こえます。 Plsは分析表を作成します。結果がまだ遅い場合、フルテーブル構造と説明の結果が表示され、テーブル – e4c5

+0

の行数の合計も表示されます** Proヒント**:回避するには 'SELECT *'。代わりに、必要な列のリストを指定します。クエリプランナは、そのリストを利用してクエリを最適化することがあります。 –

答えて

0

最初のクエリでは、必要なブロックのほとんどがディスク上にあることがわかりました。したがって、12秒は主にI/Oでした。次に、2番目のクエリで、必要なものがbuffer_poolにキャッシュされているため、10倍の速さで実行できることがわかりました。

さらなる議論については、実行してください:INDEX(did)がやりたいものは何でも行うことができます

EXPLAIN SELECT ... -- for both cases 
SHOW CREATE TABLE -- there are _many_ things here that _may_ impact your question 
How much RAM do you have? 
SHOW VARIABLES LIKE 'innodb_buffer_pool_size'; 

INDEX(did, pid)ので、は通常良い短いインデックスをドロップすることです。

関連する問題