MySql 一条普通的查询语句 你知道需要执行几次树的搜索操作以及会扫描多少行吗??? MySql 索引覆盖

114 阅读2分钟

在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天、每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹。

在这里,有一张存有300多万条数据的表,你知道接下来会发生什么吗 ?

在这里插入图片描述

一条普通的SQL查询如下:

select id from question_wrong where user_id between 740 and 770

你看到的结果如下图所示 在这里插入图片描述 你知道需要执行几次树的搜索操作以及会扫描多少行吗?

如下所示,是这个表的建表语句,一个主键索引,有个普通索引

CREATE TABLE question_wrong(
	id BIGINT(20) PRIMARY KEY ,
	user_id BIGINT(20) NOT NULL DEFAULT 0 ,
	question_info VARCHAR(16) NOT NULL DEFAULT '' ,
	INDEX index_user_id(user_id)
) ENGINE = INNODB;

当执行下面的查询语句时,它的执行流程如下图所示:

select id from question_wrong where user_id between 740 and 770

在这里插入图片描述

  • 第一步 在 user_id 索引树上找到 uer_id=740 的记录,取得 ID = 1001
  • 第二步 再到 ID 索引树查到 ID=1001 对应的 C1行数据
  • 然后第三步 在 user_id 索引树上找到 uer_id=770 的记录,取得 ID = 1010
  • 再回到 ID 索引树查到 ID=1010 对应的 C1行数据
  • 然后再回到 在 user_id 索引树上找到 uer_id=771 的记录,不满足条件,循环结束

在这个查询过程中,回主键索引表查询的过程为回表过程,这个查询过程,执行了两次回表,如当前这个查询中只期望查询返回ID这一列,而ID的值在user_id的索引树上,不需要回表查询也能获取到这个值,这种现象被称为覆盖索引,如果查询返回的列信息还有其他的,那必然得执行回表操作。


完毕

不局限于思维,不局限语言限制,才是编程的最高境界。

以小编的性格,肯定是要录制一套视频的,随后会上传

有兴趣 你可以关注一下 西瓜视频 --- 早起的年轻人

在这里插入图片描述