3-MySQL篇-3

简介: 本文详解MySQL索引核心概念:回表查询(先查索引再查主键)、覆盖索引(索引含所有查询字段,避免回表)、左前缀原则(联合索引最左匹配);并列举索引失效场景及建索引最佳实践。

11. 知道什么是回表查询嘛 ?

当我们为一张表的name字段建立了索引 , 执行如下查询语句 :

select name,age from user where name='Alice'

那么获取到数据的过程为 :

  1. 根据name='Alice'查找索引树 , 定位到匹配数据的主键值为id=18
  2. 根据id=18到主索引获取数据记录 (回表查询)

先定位主键值,再定位行记录就是所谓的回表查询,它的性能较扫一遍索引树低

12. 知道什么叫覆盖索引嘛 ?

覆盖索引是指只需要在一棵索引树上就能获取SQL所需的所有列数据 , 因为无需回表查询效率更高

实现覆盖索引的常见方法是:将被查询的字段,建立到联合索引里去。

执行如下查询语句 : select name,age from user where name='Alice'

因为要查询 nameage二个字段 , 那么我们可以建立组合索引

create index index_name_age on user(name,age)

那么索引存储结构如下 :

这种情况下, 执行select name,age from user where name='Alice' , 会先根据name='Alice', 找到记录 , 这条记录的索引上刚好又包含了 age 数据 , 直接把 Alice 77数据返回 , 就不会执行回表查询 , 这就是覆盖索引

13. 知道什么是左前缀原则嘛 ?

在mysql建立联合索引时会遵循左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配,组合索引的第一个字段必须出现在查询组句中,这个索引才会被用到 ;

例如 : create index index_age_name_sex on tb_user(age,name,sex);

上述SQL语句对 age,namesex建一个组合索引index_age_name_sex,实际上这条语句相当于建立了(age) , (age,name) , (age,name,sex)三个索引 .

select * from tb_user where age = 49 ;  -- 使用索引
select * from tb_user where age = 49 and name = 'Alice' ;  -- 使用索引
select * from tb_user where age = 49 and name = 'Alice' and sex = 'man';  -- 使用索引
select * from tb_user where age = 49  and sex = 'man';  -- 使用索引 , 但是只有 age 匹配索引 sex没有走索引
select * from tb_user where name = 'Alice' and age = 49 and sex = 'man' ;  -- 使用索引 ,  因为MySQL的查询优化器会自动调整 where 子句的条件顺序以使用适合的索引
select * from tb_user where name = 'Alice'  and sex = 'man' ;  -- 不会使用索引

14. 什么情况下索引会失效 ?

MySQL 索引通常是被用于提高 WHERE 条件的数据行匹配时的搜索速度,编写合理化的SQL能够提高SQL的执行效率

  1. 不要在列上使用函数和进行运算
  2. 不要在列上使用函数,这将导致索引失效而进行全表扫描。
  3. 尽量避免使用 != 或 not in或 <> 等否定操作符
  4. 尽量避免使用 or 来连接条件
  5. 多个单列索引并不是最佳选择,建立组合索引代替多个单列索引, 可以避免回表查询
  6. 查询中的某个列有范围查询,则其右边所有列都无法使用索引优化查找
  7. 索引不会包含有NULL值的列
  8. 当查询条件左右两侧类型不匹配的时候会发生隐式转换,隐式转换带来的影响就是可能导致索引失效而进行全表扫描。
  9. like 语句的索引失效问题like 的方式进行查询,在 like “value%” 可以使用索引,但是对于 like “%value%” 这样的方式,执行全表查询

15. 索引是越多越好嘛? 什么样的字段需要建索引, 什么样的字段不需要 ?

需要创建索引情况

  1. 主键自动建立主键索引
  2. 频繁作为查询条件的字段应该创建索引
  3. 多表关联查询中,关联字段应该创建索引 (on 两边都要创建索引)
  4. 查询中排序的字段,应该创建索引
  5. 频繁查找字段 , 应该创建索引
  6. 查询中统计或者分组字段,应该创建索引

不要创建索引情况

  1. 表记录太少
  2. 经常进⾏行行增删改操作的表
  3. 频繁更新的字段
  4. where条件里使用频率不高的字段
目录
相关文章
|
11月前
|
存储 关系型数据库 MySQL
MySQL数据库中进行日期比较的多种方法介绍。
以上方法提供了灵活多样地处理和对比MySQL数据库中存储地不同格式地日子信息方式。根据实际需求选择适当方式能够有效执行所需操作并保证性能优化。
1024 10
|
4月前
|
存储 NoSQL 算法
4-Redis篇-2
本文详解Redis集群架构与核心机制:采用哨兵集群(1主2从+3哨兵)保障高可用;对比主从复制、哨兵、Cluster分片三大方案;解析主从同步的全量/增量复制流程;说明Cluster基于16384哈希槽的分片存储原理;简述MULTI/EXEC等事务命令及实际使用情况。(239字)
235 6
|
4月前
|
Java 应用服务中间件 Maven
5-微服务篇-1
本文详解SpringBoot核心机制:①自动装配原理——通过@SpringBootApplication→@EnableAutoConfiguration→AutoConfigurationImportSelector→spring.factories加载条件化配置类;②启动流程三阶段:初始化、上下文创建、自动配置;③常用起步依赖、配置文件类型(properties/YAML)及加载优先级;④四种运行方式。
319 23
|
4月前
|
SQL JSON Java
2-SSM框架篇-3
本文详解SpringMVC核心机制:含11步标准执行流程、常用注解(@RequestMapping、@RequestBody等)及MyBatis关键知识点——#{}与${}区别、主键获取方式、字段名不一致的3种解决方案,助力Java Web开发深入理解与高效实践。(239字)
198 2
|
4月前
|
存储 关系型数据库 MySQL
3-MySQL篇-2
本文详解MySQL索引核心知识:涵盖单列索引(普通、唯一、主键、全文)、组合索引(含左前缀原则)及空间索引;剖析B+树等底层结构,对比MyISAM(非聚簇)与InnoDB(聚簇)存储引擎差异;并说明非主键索引的回表查询机制。
200 2
|
4月前
|
缓存 Java 数据库连接
2-SSM框架篇-5
MyBatis缓存分两级:一级缓存基于SqlSession,默认开启;二级缓存基于Mapper Namespace,需手动启用——配置`cacheEnabled=true`并添加`&lt;cache&gt;`标签。可设置淘汰策略、刷新间隔等参数,提升查询性能。(239字)
155 0
|
4月前
|
SQL 存储 缓存
3-MySQL篇-4
本文详解MySQL性能优化三大维度:设计上选合适引擎(InnoDB/MyISAM)、字段类型与范式;功能上优化索引、缓存、分库分表;架构上主从复制、读写分离。另涵盖超大分页优化、慢查询定位及EXPLAIN执行分析方法。(239字)
174 2
3-MySQL篇-4
|
4月前
|
存储 安全 Java
1-Java基础篇-3
本文详解Java集合与并发核心机制:HashMap扩容(阈值0.75、2倍扩容、节点重哈希优化);ConcurrentHashMap演进(1.7分段锁 vs 1.8 CAS+synchronized);线程创建4种方式及Runnable/Callable差异;synchronized与Lock锁对比;以及线程池队列满时的处理策略。
156 2
|
4月前
|
存储 缓存 Java
1-Java基础篇-4
本文详解Java线程池核心知识:四大类型(缓存、固定、定时、单线程)、七大核心参数(core/maxPoolSize、队列、拒绝策略等)、IO/计算型任务的线程数配置原则、执行流程(核心线程→队列→扩容→拒绝),以及JVM组成与字节码执行机制。
219 0
|
4月前
|
存储 前端开发 Java
1-Java基础篇-6
本文详解JVM核心机制:运行时数据区(程序计数器、虚拟机栈、本地方法栈、堆、方法区)、堆栈区别、类加载器体系(启动/扩展/系统/自定义)及双亲委派模型,并介绍Java 8新特性(Stream流常用操作filter/map/sorted等、Lambda、Optional等)。
179 1

热门文章

最新文章