0
点赞
收藏
分享

微信扫一扫

一招让order by id索引失效!

非凡兔 2023-12-25 阅读 42

测试用例

CREATE TABLE `sbtest1` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `k` int(10) unsigned NOT NULL DEFAULT '0',
  `c` char(120) NOT NULL DEFAULT '',
  `pad` char(60) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
  KEY `idx_pad` (`pad`),
  KEY `idx_k` (`k`)
) ENGINE=InnoDB AUTO_INCREMENT=10005349 DEFAULT CHARSET=utf8 MAX_ROWS=1000000

复现

set optimizer_switch = 'prefer_ordering_index=off';

一招让order by id索引失效!_MySQL

order by id主键失效,全表扫描


set optimizer_switch = 'prefer_ordering_index=on';

一招让order by id索引失效!_MySQL_02

开启后,顺利用到主键索引。


原理

参数optimizer_switch = 'prefer_ordering_index=on' 如果查询中包含

ORDER BY 或 GROUP BY 和 LIMIT 子句,优化器优先会选择有序索引(主键)。如果将其关闭,MySQL 不会扫描 SELECT ... FROM t ORDER BY pk_col LIMIT n 的主键,而是进行全表扫描和排序。


举报

相关推荐

0 条评论