select _ from t_student where class between 200 and 300需要执行几次索引树的搜索操作,会扫描多少行

简介: select _ from t_student where class between 200 and 300需要执行几次索引树的搜索操作,会扫描多少行

表初始化语句如下:

CREATE TABLE `t_student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL DEFAULT '',
  `class` varchar(50) NOT NULL DEFAULT '',
  PRIMARY KEY (`id`),
    index class_idx(class)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

insert into t_student(`name`,class) values('小明', '100'),('小詹', '200'),('小龙', '300'),('小红', '400'),('小哈', '500'),('小屁孩', '600');
AI 代码解读

执行查询的SQL语句如下:

select * from t_student where class between 200 and 300;
AI 代码解读

我们一起来看看这条 SQL 查询语句的执行流程:

  1. 在 class_idx 索引树上找到 class=200 的记录,取得 ID = 2;
  2. 回到 ID 索引树查到 ID=2 对应的 行的结果数据R2;
  3. 在 class_idx 索引树取下一个值 class=300,取得 ID=3;
  4. 回到 ID 索引树查到 ID=3 对应的 行结果数据R3;
  5. 在 class_idx 索引树取下一个值 class=400,不满足条件,循环结束。

在这个过程中,回到主键索引树搜索的过程,我们称为回表。可以看到,这个查询过程读了 class_idx 索引树的 3 条记录(步骤 1、3 和 5),回表了两次(步骤 2 和 4)。

因为主键索引的叶子节点关联的数据是整行数据,所以想要读取整行数据不得不回表。那么,什么情况下可以经过索引优化,避免回表过程呢?

覆盖索引

如果执行的语句是 select id from t_student where class between 200 and 300,这时只需要查 ID 的值,而 ID 的值已经在 class_idx 索引树上(普通索引的叶子节点数据是主键)了,因此可以直接提供查询结果,不需要回表。也就是说,在这个查询里面,索引 class_idx 已经“覆盖了”我们的查询需求,我们称为覆盖索引。
由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用的性能优化手段。
需要注意的是,在引擎内部使用覆盖索引在索引 class_idx 上其实读了三个记录,步骤1、3、5,但是对于 MySQL 的 Server 层来说,它就是找引擎拿到了两条记录,因此 MySQL 认为扫描行数是 2。

目录
打赏
0
1
1
0
9
分享
相关文章
|
7月前
|
SQL
访问者模式问题之构造一个包含 select、from 和 where 子句的 SQL 节点树,如何解决
访问者模式问题之构造一个包含 select、from 和 where 子句的 SQL 节点树,如何解决
|
7月前
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
【Azure Developer】使用PowerShell Where-Object方法过滤多维ArrayList时候,遇见的诡异问题 -- 当查找结果只有一个对象时,返回结果修改了对象结构,把多维变为一维
Elasticsearch系列---搜索执行过程及scroll游标查询
Elasticsearch系列---搜索执行过程及scroll游标查询
MySQL数据库——索引(5)-索引使用(上),验证索引效率、最左前缀法则、范围查询、索引失效情况、SQL提示
MySQL数据库——索引(5)-索引使用(上),验证索引效率、最左前缀法则、范围查询、索引失效情况、SQL提示
141 0
|
10月前
|
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
MyBatis【付诸实践 02】 mapper文件未编译+statementType使用+返回结果字段顺序不一致+获取自增ID+一个update标签批量更新记录
106 0
SQL学习之使用order by 按照指定顺序排序或自定义顺序排序
我们通常需要根据客户需求对于查询出来的结果给客户提供自定义的排序方式,那么我们通常sql需要实现方式都有哪些,参考更多资料总结如下(不完善的和错误望大家指出): 一、如果我们只是对于在某个程序中的应用是需要按照如下的方式排序,我们只需在SQL语句级别设置排序方式:
858 0
Mysql使用left join连表查询时,因连接条件未加索引导致查询很慢
Mysql使用left join连表查询时,因连接条件未加索引导致查询很慢
201 0
【INDEX】重建索引的两条参考依据
如果是OLTP系统,存在正大量的删除和更新操作的系统中,日积月累,索引将会千疮百孔,使用索引用来检索数据的效率会急转直下。因此要求我们定期的对索引进行维护,我们可以使用DROP/CREATE方式或REBUILD方式完成索引的重建,恢复索引应该有的效率。 问题来了,什么时候需要重建?重建索引的依据是什么呢? 有两个依据可供参考。第一个是,查看索引的“高度”,如果索引树高超过了4我们就需要重点关注;另外一个参考依据是,索引条目被删除的数据占总索引条目的百分比如果超过了20%,一般在这种情况下就要考虑重建索引。 如果获得这两个参考依据?方法其实很简单,我们仅需对索引进行一下分析,然后通过IND
154 0