私たちの 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 を使用しないのはなぜですか?