【问题标题】:Mysql index not work on higher limitsMysql 索引不适用于更高的限制
【发布时间】:2012-01-02 23:03:29
【问题描述】:

我有一个包含一个主键的表。 当我跑步时

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 * 来自新闻 ORDER BY 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 的限制使用索引?

【问题讨论】:

  • 该表有多少行?
  • 两个表中的索引是否相似?查看show index from news 输出。
  • 真的很奇怪,你确定要查询吗?,试试用 `` 转义名字
  • 我添加 SHOW INDEX FROM news ;通过编辑我的帖子。更改限制值会影响键的使用。
  • 所有大于28的限制计数都无法使用索引?这很奇怪,但至少考虑到行数(640),这并不意味着性能不佳。

标签: mysql query-optimization primary-key


【解决方案1】:

优化器正在尝试选择最便宜的执行路径。表中只有 640 行,优化器选择完全扫描并不奇怪。加载包含 40000 行的表,您会发现在选择全表扫描之前,您必须增加限制(可能到 2000 左右)。

【讨论】:

    猜你喜欢
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多