Trường hợp A
Truy vấn:
WHERE thread_id = 12345
AND placeholder = FALSE
ORDER BY some_column DESC
LIMIT 20
Mục lục:
(thread_id, date_created)
Kế hoạch:
Index is used
Using Where
Using filesort
Không có vấn đề ở đó, phải không? Nếu chỉ mục được sử dụng (để khớp một phần với WHERE
điều kiện), chúng ta vẫn cần một thao tác sắp xếp để sắp xếp các kết quả theo some_column
(không nằm trong chỉ mục). Chúng tôi cũng cần kiểm tra thêm (Sử dụng ở đâu) để chỉ giữ các hàng khớp với điều kiện thứ 2. ĐỒNG Ý.
Trường hợp B (câu hỏi)
Truy vấn:
WHERE thread_id = 12345
AND placeholder = FALSE
ORDER BY date_created DESC
LIMIT 20
Mục lục:
(thread_id, date_created)
Kế hoạch:
Index is used
Using Where
-- no "Using filesort"
Vì vậy, tại sao nó không cần một loại ở đây ? Bởi vì chỉ mục là đủ để sắp xếp như truy vấn muốn. Tất nhiên có vấn đề bổ sung của điều kiện bổ sung ( AND placeholder = FALSE
) không được bao phủ bởi chỉ số.
OK nhưng chúng tôi không thực sự cần một loại ở đây. Chỉ mục có thể cung cấp cho chúng tôi các kết quả khớp với điều kiện đầu tiên ( WHERE thread_id = 12345
) và theo thứ tự mong muốn cho đầu ra. Kiểm tra bổ sung duy nhất chúng tôi cần - và những gì kế hoạch thực hiện - là lấy các hàng từ bảng, theo thứ tự được cung cấp bởi chỉ mục và kiểm tra điều kiện thứ 2 này cho đến khi chúng tôi nhận được 20 kết quả khớp. Đó là những gì ** Sử dụng "" có nghĩa là gì.
Chúng tôi có thể nhận được 20 trận đấu trong 20 hàng đầu tiên (rất tốt và nhanh) hoặc trong 100 trận đầu tiên (vẫn có thể đủ nhanh) hoặc trong 1000000 đầu tiên (có thể rất, rất chậm) hoặc chúng tôi có thể chỉ nhận được 19 trận đấu từ bảng ngay cả sau khi đọc tất cả các hàng khớp từ chỉ mục (thực sự rất chậm trên một bảng lớn). Tất cả phụ thuộc vào việc phân phối dữ liệu.
Truy vấn trường hợp C (kế hoạch thậm chí tốt hơn) :
WHERE thread_id = 12345
AND placeholder = FALSE
ORDER BY date_created DESC
LIMIT 20
Mục lục:
(placeholder, thread_id, date_created)
Kế hoạch:
Index is used
-- no "Using Where"
-- no "Using filesort"
Bây giờ chỉ số của chúng tôi phù hợp với cả hai điều kiện và thứ tự của. Kế hoạch khá đơn giản: lấy * 20 trận đấu đầu tiên từ chỉ mục và đọc các hàng tương ứng từ bảng. Không cần kiểm tra thêm (Không "Sử dụng ở đâu") và không cần sắp xếp (không "Sử dụng tập tin").
đầu tiên *: 20 đầu tiên khi đọc chỉ mục ngược từ cuối (như chúng ta có ORDER BY .. DESC
) nhưng đó không phải là vấn đề. Chỉ số cây B có thể được đọc tiến và lùi với hiệu suất gần như bằng nhau.