Mysql 索引不适用于更高的限制

标签 mysql query-optimization primary-key

我有一个包含一个主键的表。 当我运行时

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/

相关文章:

mysql - 是否有关键字来标识 MySQL WHERE 子句中的 PRIMARY 列?

PHP mySQL 查询无法使用 SQL TIME 类型字段中的变量

php - 我的 SQL 查询有什么问题?

MySQL优化巨大的查询

mysql - MySQL 中一个 FOREIGN 列的 PRIMARY 和 INDEX 键

ruby-on-rails - Rails has_many :through --> Should I keep a primary key column?

mysql - 获取上一个和下一个之间的名称

php - 通过 ajax 使用 javascript 和 php 来运行 MySQL 查询

mysql - 如何根据给定查询编写优化查询?

c# - Linq2SQL "or/and"运算符(与/或条件)