MySQL中的全表扫描和索引树扫描


Posted in MySQL onMay 15, 2022
目录

引言

在学习mysql时,我们经常会使用explain来查看sql查询的索引等优化手段的使用情况。在使用explain时,我们可以观察到,explain的输出有一个很关键的列,它就是type属性,type表示的是扫描方式,代表 MySQL 使用了哪种索引类型,不同的索引类型的查询效率是不一样的。

在type这一列,有如下一些可能的选项:

system:系统表,少量数据,往往不需要进行磁盘IOconst:常量连接eq_ref:主键索引(primary key)或者非空唯一索引(unique not null)等值扫描ref:非主键非唯一索引等值扫描range:范围扫描index:索引树扫描ALL:全表扫描(full table scan)

在上面列出的7种选项中,前面五种我就不详细讲了,可以参考Mysql Explain之type详解这篇文章。我当时对于前五种属性是比较容易就理解了的,但是对于后面两种即索引树扫描和全表扫描我还是存在一些疑问。

索引树扫描我们是比较熟悉的,它就是会遍历聚簇索引树,底层是一颗B+树,叶子节点存储了所有的实际行数据。其实,全表扫描也是扫描的聚簇索引树,因为聚簇索引树的叶子节点中存储的就是实际数据,只要扫描遍历聚簇索引树就可以得到全表的数据了。

那索引树扫描和全表扫描究竟有什么区别呢?

以下将以一个实例来详细分析这两种扫描方式的区别。

实例

我们建立一张t_article表:

create table t_article(
    t_article_id int primary key auto_increment,
    t_title varchar(40),
);

在我们创建的t_article表中,只有两个字段,一个是主键t_article_id,另一个是普通字段t_title

我们知道,InnoDB会将聚簇索引默认建立在主键上,而聚簇索引树中的叶子节点就存储了整张表的行数据。

接着,我们分别设计两个sql查询case:

走主键索引

explain SELECT t_article_id FROM t_article;

走全表扫描:

explain SELECT t_title FROM t_article;

以上两个查询都没有where查询,按理来说底层的sql执行情况应该是差不多的。

结果分析

我们可以来看看上面两种查询的结果,在查询时使用explain语句输出sql执行的详细信息。

1.走索引扫描

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t_article   index   PRIMARY 4   2 100 Using index

2.走全表扫描

id select_type table partitions type possible_keys key key_len ref rows filtered Extra
1 SIMPLE t_article   ALL      

从以上两个查询结果中我们可以发现,走主键索引的查询和走全表的查询是不一样的。我们前面也提到了,InnoDB的索引是使用B+树来实现的,而主键索引中存储了整张表的数据,那全表扫描时其实也是扫描的主键索引。那为什么这两种查询会不一样呢?按理来说都是查询的主键索引,它们应该是一样的。

其实,它们两者是有一些细节区别的。

比如,第一个查询,它的优化手段是使用索引树扫描,也就是type中显示的index属性,而且它还使用了覆盖索引,即Extra列中的Using index属性。之所以第一个查询能够使用这两种优化手段,其实是因为select查询的结果列只包含主键,而主键的值是可以直接在遍历聚簇索引树时确定,也不需要回表查询了。

对于第二个查询,它也没有使用where进行过滤,而且它的select结果列包含的是普通列,并不是主键或者其他索引列,所以它会走全表扫描。而全表扫描其实底层也是扫描的聚簇索引树,也就是底层的B+树。这种全表扫描与索引树扫描有一个明显区别,那就是,全表扫描不仅仅需要扫描索引列,还需要扫描每个索引列中指向的实际数据,这里包含了所有的非索引列数据。

前面的分析可能还是有点生硬和难以理解,具体地,我们通过下面一张图来更直观地看一下:

MySQL中的全表扫描和索引树扫描

图片源自:从数据页的角度看 B+ 树

从上面的图我们可以看到,对于索引扫描来讲,它只需要读取叶子节点的所有key,也就是索引的键,而不需要读取具体的data行数据;而对于全表扫描来说,它无法仅仅通过读取索引列获得需要的数据,还需要读取具体的data数据才能获取select中指定的非索引列的具体值。所以,全表扫描的效率相比于索引树扫描相对较低一点,但是差距不是很大。

参考

【mysql】全表扫描过程 & 聚簇索引 区别和联系
从数据页的角度看 B+ 树

到此这篇关于MySQL中的全表扫描和索引树扫描 的文章就介绍到这了,更多相关mysql全表扫描和索引树扫描 内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

MySQL 相关文章推荐
MySQL 如何分析查询性能
May 12 MySQL
简单了解 MySQL 中相关的锁
May 25 MySQL
MySQL中VARCHAR与CHAR格式数据的区别
May 26 MySQL
MySQL中InnoDB存储引擎的锁的基本使用教程
May 26 MySQL
详细谈谈MYSQL中的COLLATE是什么
Jun 11 MySQL
MySQL 亿级数据导入导出及迁移笔记
Jun 18 MySQL
MySQL REVOKE实现删除用户权限
Jun 18 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
详解MySql中InnoDB存储引擎中的各种锁
Feb 12 MySQL
Innodb存储引擎中的后台线程详解
Apr 03 MySQL
MySQL分区以及建索引的方法总结
Apr 13 MySQL
mysql数据库隔离级别详解
Jun 16 MySQL
MySQL sql模式设置引起的问题
May 15 #MySQL
MySQL 逻辑备份 into outfile
May 15 #MySQL
Mysql开启外网访问
May 15 #MySQL
Mysql索引失效 数据库表中有索引还是查询很慢
MySQL查询日期时间
May 15 #MySQL
MySQL 数据库 增删查改、克隆、外键 等操作
May 11 #MySQL
MySQL 计算连续登录天数
May 11 #MySQL
You might like
PHP array_flip() 删除重复数组元素专用函数
2010/05/16 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
浅谈PHP调用Webservice思路及源码分享
2014/06/04 PHP
thinkphp框架实现删除和批量删除
2016/06/29 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
jQuery的实现原理的模拟代码 -5 Ajax
2010/08/07 Javascript
js禁止document element对象选中文本实现代码
2013/03/21 Javascript
jQuery动态地获取系统时间实现代码
2013/05/24 Javascript
js获取对象为null的解决方法
2013/11/21 Javascript
JS数字抽奖游戏实现方法
2015/05/04 Javascript
JavaScript中用sort()方法对数组元素进行排序的操作
2015/06/09 Javascript
JS+CSS实现电子商务网站导航模板效果代码
2015/09/10 Javascript
JavaScript中的定时器之Item23的合理使用
2015/10/30 Javascript
jQuery继承extend用法详解
2016/10/10 Javascript
Angular使用过滤器uppercase/lowercase实现字母大小写转换功能示例
2018/03/27 Javascript
JS同步、异步、延迟加载的方法
2018/05/05 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
Vue实现调节窗口大小时触发事件动态调节更新组件尺寸的方法
2018/09/15 Javascript
关于Vue项目跨平台运行问题的解决方法
2018/09/18 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
详解如何给React-Router添加路由页面切换时的过渡动画
2019/04/25 Javascript
vue中可编辑树状表格的实现代码
2020/10/31 Javascript
使用python实现男神女神颜值打分系统(推荐)
2019/10/31 Python
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?用contains来区分是否有重复的对象。还是都不用
2013/07/30 面试题
语文教育专业推荐信范文
2013/11/25 职场文书
大学运动会通讯稿
2014/01/28 职场文书
更夫岗位责任制
2014/02/11 职场文书
三好学生演讲稿范文
2014/04/26 职场文书
主题班会演讲稿
2014/05/22 职场文书
法院授权委托书格式
2014/09/28 职场文书
研究生个人学年总结
2015/02/14 职场文书
证婚人婚礼致辞
2015/07/28 职场文书
【海涛DOTA】D-cup邀请赛NV.cn vs DT.Love
2022/04/01 DOTA
Python接口自动化之文件上传/下载接口详解
2022/04/05 Python
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技