我在 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),查询仍将在正常的 0.003 秒内执行。
在我不理解的 WHERE 子句中引用索引列时,是否有关于 InnoDB 和排序结果的内容?
还是我做错了什么?
慢查询的解释返回以下结果:
+----+-------------+-------+--------+--------------------------+---------+---------+---------------------+-------+---------------------------------------------------------------------+
| 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 |
+----+-------------+-------+--------+---------------+---------+---------+----------------------+------+-------------+
任何帮助将不胜感激。