在码农的世界里,优美的应用体验,来源于程序员对细节的处理以及自我要求的境界,年轻人也是忙忙碌碌的码农中一员,每天、每周,都会留下一些脚印,就是这些创作的内容,有一种执着,就是不知为什么,如果你迷茫,不妨来瞅瞅码农的轨迹。
在这里,有一张存有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的索引树上,不需要回表查询也能获取到这个值,这种现象被称为覆盖索引,如果查询返回的列信息还有其他的,那必然得执行回表操作。
完毕
不局限于思维,不局限语言限制,才是编程的最高境界。
以小编的性格,肯定是要录制一套视频的,随后会上传
有兴趣 你可以关注一下 西瓜视频 --- 早起的年轻人