我想弄清楚为什么我的一个查询速度慢,我如何解决它,但我对我的结果有点困惑。为什么MySQL在查询中使用LIMIT时速度很慢?
我有一个orders
表周围80列和775179行和我做以下请求:
SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL ORDER BY creation_date DESC LIMIT 200
这在4.5S
返回38行当除去ORDER BY
我很好的改进:
SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL LIMIT 200
分38排在0.30s
但没有接触ORDER BY
我得到一个更好的结果取出LIMIT
时:
SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL ORDER BY creation_date DESC
38排在0.10s(??)
为什么我的LIMIT如此饥饿?
的进一步深入
送我的答案之前注意到,我有一个指数creation_date
(这是一个datetime
)我删除它和第一个查询现在0.10s运行后,我尝试了一些东西。这是为什么 ?
编辑
好猜,我对那里的人列部分索引。
mysql> explain SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL ORDER BY creation_date DESC LIMIT 200;
+----+-------------+--------+-------+------------------------+---------------+---------+------+------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+------------------------+---------------+---------+------+------+-------------+
| 1 | SIMPLE | orders | index | id_state_idx,id_mp_idx | creation_date | 5 | NULL | 1719 | Using where |
+----+-------------+--------+-------+------------------------+---------------+---------+------+------+-------------+
1行集(0.00秒)
mysql> explain SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL ORDER BY creation_date DESC;
+----+-------------+--------+-------+------------------------+-----------+---------+------+-------+----------------------------------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+--------+-------+------------------------+-----------+---------+------+-------+----------------------------------------------------+
| 1 | SIMPLE | orders | range | id_state_idx,id_mp_idx | id_mp_idx | 3 | NULL | 87502 | Using index condition; Using where; Using filesort |
+----+-------------+--------+-------+------------------------+-----------+---------+------+-------+----------------------------------------------------+
因为在第一次查询后,结果被(部分)缓存为以下查询... – Mr47
事实并非如此,重新运行同样的查询给了我一致的结果 –
也许你的服务器很慢.... – pattyd