1

私のテーブルには 1,000,000 行と 4 列があります。

id  cont    stat   message

1   rgrf       0   ttgthyhtg
2   frrgt      0   tthyrt
3   4r44       1   rrttttg
...

インデックス作成を行ったにもかかわらず、非常に遅い選択クエリを実行しています

  SELECT * FROM tablea WHERE stat='0' order by id LIMIT 1

このクエリはmysql非常に遅くなります。mysql Explainで確認したところ、これが見つかりました

  explain SELECT * FROM tablea WHERE stat='0' order by id LIMIT 1

出力にショックを受けましたが、最適化する方法がわかりません。

id  select_type  table   type  possible_keys  key  key_len  ref      rows  Extra
 1  SIMPLE       tablea  ref   stat           stat       4  const  216404  Using where

最適化のために 216,404 行あり、1 つまたは 2 つに減らす必要がありますが、どうすればよいでしょうか?

4

2 に答える 2

0

問題は、MySQL がクエリでテーブルごとに 1 つのインデックスしか使用できないことです。これは、このstat場合のインデックスです。したがって、ORDER BYインデックスを使用せずに実行されるため、1M 行では非常に遅くなります。次のことを試してください。

  • 正しいインデックスを暗黙的に使用します。 SELECT * FROM tablea USE INDEX(PRIMARY) WHERE stat='0' order by id LIMIT 1

  • Ollie Jones が上で述べたように、複合インデックスを作成します。

于 2012-11-22T16:53:44.417 に答える
0

(stat, id) に複合インデックスを作成することをお勧めします。これにより、検索/注文操作が最適化される場合があります。もちろん、マイナス面もあります。挿入と更新で余分なオーバーヘッドが発生します。

CREATE INDEX ON tablea (stat,id) USING BTREE

試してみる。

于 2012-11-22T16:49:12.570 に答える