Hãy xem xét một bảng các giá trị và giá trị băm, như vậy:
+------------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| val | char(9) | NO | | NULL | |
| val_hashed | char(50) | YES | | NULL | |
+------------+----------+------+-----+---------+----------------+
Truy vấn sau kết thúc sau 0,00 giây:
SELECT * FROM hashes ORDER BY 1 DESC LIMIT 1;
Tuy nhiên, truy vấn này mất 3 phút 17 giây:
SELECT val FROM hashes ORDER BY 1 DESC LIMIT 1;
Tôi thấy rằng trong khi truy vấn đang chạy, danh sách quy trình hiển thị nó dưới dạng trạng thái Sorting result
. Tình hình là hoàn toàn tái sản xuất. Lưu ý rằng có một quá trình khác thực hiện các INSERT
hoạt động trên bàn liên tục.
Tại sao truy vấn cụ thể sẽ mất nhiều thời gian hơn so với *
truy vấn? Tôi luôn tin rằng *
các truy vấn nên được tránh cụ thể vì lý do hiệu suất.
ORDER BY NUMBER
cú pháp là khá dễ bị lỗi.
SELECT *
kết hợp với chỉ mục cột trong ORDER BY
đang làm xáo trộn cột nào đang được sắp xếp - một lý do khác để tránh *
s ...
*
là không rõ ràng. Vì vậy, nói "đưa cho tôi tất cả các cột và sắp xếp theo cột thứ ba" có ý nghĩa quyết định như nói "hãy đi siêu thị và cho tôi biết bạn đã vượt qua bao nhiêu đèn giao thông"
id
để tìm hàng đầu tiên. Cái thứ hai cần sắp xếp kết quả hoàn chỉnh trên cột (không được lập chỉ mục)val
.