Tôi có hai truy vấn,
select some_other_column
from `table`
order by primary_index_column asc
limit 4000000, 10;
và
select some_other_column
from `table`
order by secondary_index_column asc
limit 4000000, 10;
Cả hai trả về 10 hàng; lần đầu tiên mất 2,74 giây và lần thứ hai mất 7,07 giây. some_other_column
không phải là một phần của bất kỳ chỉ số. primary_index_column
là cột khóa chính; secondary_index_column
có chỉ số b-cây và số lượng thẻ là 200 (theo MySQL).
Đây là explain
kết quả:
mysql> explain select some_other_column from `table` order by primary_index_column limit 4000000, 10;
+----+-------------+---------+-------+---------------+---------+---------+------+---------+-------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+-------+---------------+---------+---------+------+---------+-------+
| 1 | SIMPLE | table | index | NULL | PRIMARY | 4 | NULL | 4000010 | |
+----+-------------+---------+-------+---------------+---------+---------+------+---------+-------+
mysql> explain select some_other_column from `table` order by secondary_index_column limit 4000000, 10;
+----+-------------+---------+------+---------------+------+---------+------+---------+----------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------+------+---------------+------+---------+------+---------+----------------+
| 1 | SIMPLE | table | ALL | NULL | NULL | NULL | NULL | 4642945 | Using filesort |
+----+-------------+---------+------+---------------+------+---------+------+---------+----------------+
Tại sao MySQL chọn kế hoạch thực hiện cụ thể cho truy vấn thứ hai? Tôi không hiểu tại sao nó có thể sử dụng chỉ mục cho truy vấn đầu tiên nhưng không sử dụng cho truy vấn thứ hai.