MySQL:覆盖索引实例请教
CREATE TABLE T_ORDER (
ID INT PRIMARY KEY AUTO_INCREMENT,-- 自增主键
ORDER_CODE VARCHAR (10) NOT NULL,-- 订单编码
ORDER_AMOUNT INT NOT NULL,-- 订单数量
UNIQUE KEY UNIQUE_ORDER_CODE (ORDER_CODE)
);
1、创建订单表(T_ORDER),订单表中包含订单编码(ORDER_CODE)、订单数量(ORDER_AMOUNT)
2、向订单表(T_ORDER)中插入五万条测试数据
EXPLAIN SELECT ORDER_CODE, ORDER_AMOUNT FROM T_ORDER ORDER BY ORDER_CODE LIMIT 1000;
EXPLAIN结果如下:
通过 type = ALL 可知进行了全表扫描
我的疑问是:既然二级索引(UNIQUE_ORDER_CODE)已将ORDER_CODE排序,SQL的逻辑为什么不是先从二级索引中取前1000个ORDER_CODE,再根据这1000个ORDER_CODE到聚簇索引中回表查询出ORDER_AMOUNT呢?MySQL为何会判定这种场景需要进行全表扫描呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
或者数据量太小了?
你加到百万试试看呢
首先要了解mysql的执行顺序(简化了一些)
是先取出结果集,再去limit截取。(试想如果sql是这样:
select username,min(amount) min_amount from tb group by username order by min_amount limit 10
)如果想用到覆盖索引,那得改造下