Tôi đang cố gắng tìm ra lý do tại sao truy vấn của tôi chậm lại và cách tôi có thể khắc phục nhưng tôi hơi bối rối về kết quả của mình.Tại sao MySQL chậm khi sử dụng LIMIT trong truy vấn của tôi?
Tôi có một bảng orders
với khoảng 80 cột và 775.179 hàng và tôi đang làm theo yêu cầu sau:
SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL ORDER BY creation_date DESC LIMIT 200
trả về 38 dòng trong 4.5s
Khi tháo ORDER BY
tôi 'm nhận được một cải tiến tốt đẹp:
SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL LIMIT 200
38 hàng trong 0.30s
Nhưng khi tháo LIMIT
mà không cần chạm vào ORDER BY
tôi nhận được một kết quả thậm chí tốt hơn:
SELECT * FROM orders WHERE id_state = 2 AND id_mp IS NOT NULL ORDER BY creation_date DESC
38 hàng trong 0.10s (??)
Tại sao LIMIT của tôi lại quá đói?
ĐI THÊM
Tôi đã cố gắng một vài điều trước khi gửi câu trả lời của tôi và sau khi nhận thấy rằng tôi đã có một chỉ mục trên creation_date
(mà là một datetime
) Tôi đã gỡ bỏ nó và truy vấn đầu tiên bây giờ chạy trong 0.10s . Tại sao vậy ?
EDIT
Tốt đoán, tôi có chỉ số trên các cột khác là một phần của nơi.
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 dòng trong set (0.00 sec)
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 |
+----+-------------+--------+-------+------------------------+-----------+---------+------+-------+----------------------------------------------------+
Vì sau truy vấn đầu tiên, kết quả được (một phần) được lưu trong bộ nhớ truy vấn sau ... – Mr47
Đây không phải là trường hợp, chạy lại các truy vấn giống nhau đang cho tôi kết quả nhất quán –
Có thể máy chủ của bạn bị chậm .... – pattyd