建设网站 织梦,wordpress 评论 模块,做一款app需要什么技术,商标设计思路后端开发#xff0c;公众号内容包括但不限于 python、mysql、数据结构和算法、网络协议、Linux。技术人怎能只有技术和代码#xff0c;如果你对投资理财、保险#xff0c;英语学习、读书写作有兴趣#xff0c;都欢迎来公众号【谭某人】与我交流#xff0c;你总会有些收获。… 后端开发公众号内容包括但不限于 python、mysql、数据结构和算法、网络协议、Linux。技术人怎能只有技术和代码如果你对投资理财、保险英语学习、读书写作有兴趣都欢迎来公众号【谭某人】与我交流你总会有些收获。在 InnoDB 中从二级索引回到主键索引查询数据这个过程称作回表过程而且这个回表过程是可以被优化的这个优化就是利用覆盖索引。先说结论如果一个索引的字段包含了所有要查询的字段这个索引就称作覆盖索引覆盖索引可以减少回表过程能有效提高查询效率。前面我们有说过在 InnoDB 中数据都是保存在 B 树上主键索引保存了整行记录二级索引保存了主键的值。一次查询操作要么是遍历主键索引要么是遍历二级索引要么就是先遍历二级索引得到主键 id 的值然后再到主键索引上通过主键 id 查找满足要求的记录。如果只遍历一次 B 树就能获取到我们要的数据即没有回表过程这个效率显然是不错的这就是覆盖索引的优势。下面看个具体的例子。mysql create table user(
id int(11) primary key,
name varchar(20) not null,
age int(11),
sex int(11),
index (age)) engineInnoDB;
依然是新建一个表创建索引插入一些测试数据注意这里只是为了解释说明覆盖索引并不表示 mysql 的真实执行方式因为会涉及到 mysql 的优化器机制这里暂且不说了以后再写。1 bob 16 1
2 kom 19 0
3 gum 18 1
4 tt 20 1
5 yy 25 1
创建一个 user 表给 age 字段添加一个二级索引并插入上面五条数据然后看下面这条查询语句。select name from user where age between 18 and 21
我们来分析下这条 sql 的执行过程1、age 字段上有索引mysql 会先到 age 字段的 B 树上找到满足条件的第一个叶子节点age19这个叶子节点上保存了对应主键 id 的值 2然后再到主键索引上找到 id 为 2 的这条记录同时把 name 字段拿出来。2、重复第一步的操作继续从 age 索引上的叶子节点往后遍历找出满足条件的第二个叶子节点同样回到主键上拿出 name 字段的值直到遍历到不满足条件的叶子节点age25。也就是说这条 sql 语句虽然用到了索引但是 age 索引上并没有要查询的 name 字段所以只能回表到主键索引上查出 name 字段所以这个过程其实是遍历了个两个 B 树。那么我们删除 age 这个单列索引创建一个覆盖索引 (age,name) 把要查询的 name 字段也添加到索引中来。#删除原索引
drop INDEX age on USER
#新建覆盖索引
ALTER TABLE USER add index age_name(age,name)
由于现在这个覆盖索引上的字段包含了要查询的 age 和 name 字段免去了到主键索引上查询数据的过程其实也就是只遍历了一个 B 树可以大大提升查询效率。添加索引虽然能提升查询效率但索引也是需要占用额外空间的而且索引还需要维护成本所以通常加不加索引需要根据实际需求来权衡。总之在设计索引或者优化 sql 语句的时候要尽量避免回表操作所以使用覆盖索引是一种常用的 sql 优化手段。所以我们平时写 sql 语句的时候select 后面只写查询需要用到的字段去掉不需要的字段避免回表操作。【End】听说你对现在的工作不是特别满意别担心老王给你准备一份「Java最常见200面试题全解析」助力大家找到更好的工作这份面试题包含的模块Java、JVM 最常见面试题解析Spring、Spring MVC、MyBatis、Hibernate 面试题解析MySQL、Redis 面试题解析RabbitMQ、Kafka、Zookeeper 面试解析微服务 Spring Boot、Spring Cloud 面试解析扫描下面二维码付费阅读关注下方二维码订阅更多精彩内容。转发朋友圈是对我最大的支持。