私は FreeBSD で MySQL 5.6 を使用していますが、最近、MyISAM テーブルの使用から InnoDB に切り替えて、外部キーの制約とトランザクションを強化しました。
切り替え後、以前は 0.003 秒かかっていた 100,000 行のテーブルに対するクエリが 3.6 秒かかっていることがわかりました。クエリは次のようになります。
SELECT *
-> FROM USERS u
-> JOIN MIGHT_FLOCK mf ON (u.USER_ID = mf.USER_ID)
-> WHERE u.STATUS = 'ACTIVE' AND u.ACCESS_ID >= 8 ORDER BY mf.STREAK DESC LIMIT 0,100
ORDER BY句を削除すると、実行時間が 0.003 秒に短縮されたことに気付きました。問題は明らかに並べ替えにあります。
次に、 ORDER BYを追加し直して、クエリで参照される列 ( STATUSおよびACCESS_ID ) のインデックスを削除すると、クエリの実行時間が通常の 0.003 秒かかることがわかりました。
次に、STATUS列とACCESS_ID列にインデックスを追加し直しても、 IGNORE INDEX (STATUS,ACCESS_ID)を使用すると、クエリは通常の .003 秒で実行されることがわかりました。
InnoDB と、WHERE 句でインデックス付きの列を参照するときの結果の並べ替えについて、理解できないことはありますか?
それとも私は何か間違ったことをしていますか?
遅いクエリのEXPLAINは、次の結果を返します。
+----+-------------+-------+--------+--------------------------+---------+---------+---------------------+-------+---------------------------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+--------------------------+---------+---------+---------------------+-------+---------------------------------------------------------------------+
| 1 | SIMPLE | u | ref | PRIMARY,STATUS,ACCESS_ID | STATUS | 2 | const | 53902 | Using index condition; Using where; Using temporary; Using filesort |
| 1 | SIMPLE | mf | eq_ref | PRIMARY | PRIMARY | 4 | PRO_MIGHT.u.USER_ID | 1 | NULL |
+----+-------------+-------+--------+--------------------------+---------+---------+---------------------+-------+---------------------------------------------------------------------+
高速クエリのEXPLAINは、次の結果を返します。
+----+-------------+-------+--------+---------------+---------+---------+----------------------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+-------+--------+---------------+---------+---------+----------------------+------+-------------+
| 1 | SIMPLE | mf | index | PRIMARY | STREAK | 2 | NULL | 100 | NULL |
| 1 | SIMPLE | u | eq_ref | PRIMARY | PRIMARY | 4 | PRO_MIGHT.mf.USER_ID | 1 | Using where |
+----+-------------+-------+--------+---------------+---------+---------+----------------------+------+-------------+
どんな助けでも大歓迎です。