2

私たちの MySQL(Percona Server) データベースには 1000 万行を含む大きなテーブルがあり、次のように 40 秒を超える低速のクエリが多数あります。

  SELECT col1, Seller, col3, col4, Id, col5  
    FROM table1 
   WHERE Seller = 346761 
     AND col1 IN (2, 3, 4) 
     AND col3 = 1  
     AND col4 NOT IN (5,6,7)  
ORDER BY Id DESC 
   LIMIT 0, 20;

Seller、およびcol1、、、col3にインデックスを作成しましたcol4。これらのインデックスは個別のものであり、マルチカラム インデックス (AKA カバリング インデックス) ではありません。そして、Id主キーです。

EXPLAIN は、MySQL が売り手に関するインデックスではなく、主キーをインデックスとして使用してこの sql をクエリすることを示しています。

+----+-------------+------------------+-------+--------------------+---------+---------+------+------+-------------+
| id | select_type | table            | type  | possible_keys      | key     | key_len | ref  | rows | Extra       |
+----+-------------+------------------+-------+--------------------+---------+---------+------+------+-------------+
|  1 | SIMPLE      | trans_audit_list | index | Seller,AuditStatus | PRIMARY | 8       | NULL | 1483 | Using where | 
+----+-------------+------------------+-------+--------------------+---------+---------+------+------+-------------+

Iforce index (Seller)のときは、0.7 秒と非常に高速です。

そして、limit ステートメントを使用しない場合、このクエリはSellerインデックスを使用し、非常に高速になることがわかりました。MySQLSellerが limit ステートメントで index on を使用しないのはなぜですか?

4

3 に答える 3

1

遭遇したように、インデックスを持っているからといって、それが使用されるわけではありません。これはすべてのデータベースに当てはまります。インデックスの選択はクエリ オプティマイザ次第です。試したように、インデックスを強制しても最速の結果が得られるわけではありません。

それに続いて、クエリ キャッシュが役に立たない可能性があります。クエリ プランがキャッシュされる可能性があるため、インデックスは考慮されません。

MySQL はステートメントごとに 1 つのインデックスしか使用しないため、カバリング インデックス (複数列) を使用することをお勧めしますが、確認のためにテストする必要があります。

于 2013-03-18T03:01:22.007 に答える
1

[Seller] の非クラスター インデックスの断片化が多すぎる可能性があり、統計が古くなっている可能性があります。その場合、クエリ オプティマイザーは最適なクエリ プランを選択しない可能性があります。このクエリがユーザーによって頻繁に使用され、コストに見合う場合は、フラグメンテーションを確認し、統計を更新するか、Seller で非クラスター インデックスを再構築します。カバリング インデックスを作成するときは、順序がエンド ユーザーが最もよく使用する順序であることを確認してください。クエリのように、カバー インデックスは [seller->col1->col3->col4] にある必要があります。

于 2013-03-18T04:14:51.897 に答える
1

ORDER BY DESC+LIMIT句に複数のインデックスが追加される可能性がある状況は、 mysqlのオプティマイザにとって一般的な問題のある状況であり、インデックスの強制が実際に正当である可能性がある非常にまれなケースの 1 つです。

IN (...)あなたの句はオプティマイザにとって追加の手間になることにも注意してください。

本当に必要ない場合は、エンジンが主キーの順序付けの利点を利用できるように、ASC代わりにid で順序付けすることをお勧めします。これは、さらに実装するまで続きます。DESCASC

于 2013-03-18T03:28:29.713 に答える