我有一个包含一个主键的表。 当我运行时
EXPLAIN SELECT * FROM news ORDER BY id ASC LIMIT 29
Mysql返回
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE news ALL NULL NULL NULL NULL 640 Using filesort
但是通过EXPLAIN SELECT * 来自新闻 按 id ASC 排序 限制 28 它返回
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE news index NULL PRIMARY 4 NULL 28
显示新闻索引;
Table, Non_unique, Key_name, Seq_in_index, Column_name, Collation, Cardinality, Sub_part, Packed, Null, Index_type, Comment
'news', 0, 'PRIMARY', 1, 'id', 'A', 640, , '', '', 'BTREE', ''
'news', 1, 'tarix', 1, 'tarix', 'A', 106, , '', '', 'BTREE', ''
'news', 1, 'yayindil', 1, 'yayin', 'A', 3, , '', '', 'BTREE', ''
'news', 1, 'yayindil', 2, 'dil', 'A', 7, , '', '', 'BTREE', ''
我在其他表上检查过,它们在限制 4000 时也能正常工作。出了什么问题?为什么只有 29 岁以下限制使用索引?
最佳答案
优化器正在尝试选择成本最低的执行路径。由于表中只有 640 行,优化器选择完全扫描并不奇怪。加载 40000 行的表,你会发现在选择全表扫描之前必须增加限制(可能到 2000 左右)。
关于Mysql 索引不适用于更高的限制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8706224/