《MySQL面试小抄》索引考点二面总结
《MySQL面试小抄》索引考点二面总结
我是肥哥,一名不专业的面试官!
我是囧囧,一名积极找工作的小菜鸟!
囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点!!!
本期主要面试考点
面试官考点之谈谈索引维护过程?页分裂?页合并?
面试官考点之简述一下查询时B+树索引搜索过程?
面试官考点之什么是回表?
面试官考点之什么是索引覆盖?使用场景?
面试官考点之什么情况下会索引失效?
面试官考点之哪些情况下,可能会面临索引失效的问题?
面试官考点之or走索引和索引失效分别是什么场景?
面试官考点之哪些情况下需要创建索引?
面试官考点之联合索引之最左前缀原则?
面试官考点之索引下推场景?


面试官考点之谈谈索引维护过程?页分裂?页合并?
B+树为了维护索引有序性,在插入删除的时候需要做必要的维护,必要时候可能涉及到页分裂,页合并过程!
首先假设每个叶子节点(数据页或磁盘块)只能存储3条索引和数据记录,如图

情况1、新增行记录,ID=3,此时【数据页1】未满,只需要在data2后新增ID=3的行记录,B+树整体结构不需要进行调整

情况2、新增行记录,ID=8,此时【数据页2】已满,这时候需要申请一个新的数据页,然后挪动部分数据过去。这个过程称为页分裂。
页分裂过程消耗性能,同时空间利用率也降低了
有分裂就有合并,当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。合并的过程,可以认为是分裂过程的逆过程。
当相邻两个页由于删除了数据,利用率很低之后,会将数据页做合并。合并的过程,可以认为是分裂过程的逆过程。
【数据页2】删除了ID=7,ID=8的行记录,此时【数据页2】【数据页3】利用率很低,将进行页合并。
面试官考点之简述一下查询时B+树索引搜索过程?
准备一张用户表,其中id为主键,age为普通索引
CREATE TABLE `user` (
`id` int(11) PRIMARY KEY,
`name` varchar(255) DEFAULT NULL,
`age` int(11) DEFAULT NULL
KEY `idx_age` (`age`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
select * from user where age=22 简述一下B+树索引搜索过程?
假设要查询的记录
id=5,name="张三",age=22
MySQL为每个索引分别维护了一棵B+Tree索引树,
主键索引非叶子节点维护了索引键,叶子节点存储行数据;
非主键索引也称为二级索引,非叶子节点存储主键;
B+树索引搜索过程
搜索条件 age=22,可走idx_age索引,首先加载idx_age索引树,找到age=22的记录,取得id=5
回表搜索,加载主键索引树,找到id=22的记录,取得整行数据
面试官考点之什么是回表?
idx_age二级索引树找到主键id后,回到id主键索引搜索的过程,就称为回表。
并非所有非主键索引搜索,都需要进行回表搜索,也就是下面要说的索引覆盖。
面试官考点之什么是索引覆盖?使用场景?
在上面提到的例子中,由于查询结果所需要的数据只在主键索引上有,所以不得不回表。
如果在查询的数据列里面,直接从索引列就能取到想要的结果,就不需要再回表去查,也称之为索引覆盖!
索引覆盖的优点
可以避免对Innodb主键索引的二次查询
可以避免MyISAM表进行系统调用
可以优化缓存,减少磁盘IO操作
修改一下上述栗子,满足索引覆盖条件?
select id, age from user where age=22
查询的信息,id,age都可以直接在idx_age 索引树中获取,不需要回表搜索。
由于覆盖索引可以减少树的搜索次数,显著提升查询性能,所以使用覆盖索引是一个常用 的性能优化手段。
索引是一把双刃剑,提供快速排序搜索的同时,索引字段的维护也是要付出相应的代价的。
因此,在建立冗余索引来支持覆盖索引时就需要权衡考虑了
面试官考点之索引失效?
创建的索引,到底有没有生效,或者说SQL语句有没有使用索引查询?
一个最常见的查询场景,建立idx_name索引
select * from t_user where user_name like '%mayun100%';
这条查询是否走索引?

select * from t_user where user_name like 'mayun100%';
这条查询是否走索引?

面试官考点之有哪些情况下,可能会面临索引失效的问题?
like通配符,左侧开放情况下,全表扫描
or条件筛选,可能会导致索引失效
where中对索引列使用mysql的内置函数,一定失效
where中对索引列进行运算(如,+、-、*、/),一定失效
类型不一致,隐式的类型转换,导致的索引失效
where语句中索引列使用了负向查询,可能会导致索引失效 负向查询包括:NOT、!=、<>、!<、!>、NOT IN、NOT LIKE等。其中!< !> 为SQLServer语法。
索引字段可以为null,使用is null或is not null时,可能会导致索引失效
隐式字符编码转换导致的索引失效
联合索引中,where中索引列违背最左匹配原则,一定会导致索引失效
MySQL优化器的最终选择,不走索引
面试官考点之or走索引和索引失效分别是什么场景?
or走索引和索引失效分别是什么场景?

OR 连接的是同一个字段,相同走索引
explain select * from t_user where user_name = 'mayun10' or user_name = 'mayun1000'

OR 连接的是两个不同的字段,不走索引

给address列增加索引
alter table t_user add index idx_address(address);
explain select * from t_user where user_name = 'mayun10' or address = '浙江杭州12';
OR 连接的是两个不同字段,如果两个字段皆有索引,走索引

(插播,下一期:《MySQL面试小抄》几种索引失效场景验证)
尽请关注:囧么肥事
面试小抄系列。
面试官考点之哪些情况下需要创建索引?
1.主键自动建立唯一索引
2.频繁查询的字段
3.JOIN 关联查询,作为外键关系的列建立索引
4.单键/组合索引的选择问题,高并发下倾向创建组合索引,创建时遵循最左前缀匹配原则
5.ORDER BY 查询中排序的字段,排序字段通过索引访问大幅提高排序速度
6.GROUP BY 需要分组字段或查询中统计字段
面试官考点之联合索引之最左前缀原则
MySQL建立多列索引(联合索引)有最左前缀的原则,即最左优先
当MySQL建立的是联合索引,假设以(a,b,c) 列作为联合索引,那么MySQL建树规则是什么?
我们知道MySQL会为每一个索引维护一颗B+Tree,非叶子节点存储索引key,叶子节点存储行数据data。
联合索引(a,b,c) 相当于建立了 (a), (a,b), (a,b,c) 三个索引,MySQL组装索引树时,是按照从左到右的顺序来建立B+Tree的联合索引树的。
匹配索引情况一
假设(a,b,c)索引要搜索的值为('张三', 21, 100) ,检索数据时,匹配的顺序就是a,b,c。
B+Tree会优先比较a来确定下一步的所搜方向,如果a相同再依次比较b和c,最后得到检索的数据;
匹配索引情况二
假设(a,c)索引要搜索的值为('张三', 100) ,检索数据时,匹配的顺序就是a,b,c。
B+Tree使用a来指定搜索方向,但下一个字段b缺失,所以只能把a等于张三的数据都找到,然后再匹配c是100的数据。
匹配索引情况三
假设(b,c)索引要搜索的值为('张三', 21) ,检索数据时,无匹配顺序
B+Tree不知道下一步该查哪个节点,因为建立搜索树的时候a是第一个比较因子,必须要先根据a来搜索才能知道下一步去哪里查询。此时索引失效!
索引项是按照索引定义里面出现的字段顺序排序的,最左前缀可以是联合索引的最左N个字段,也可以是字符串索引的最左M个字符。
面试官考点之索引下推场景?
索引下推,即减少二级索引回表搜索次数!!!
通俗说,减少查询主键索引树次数,减少磁盘IO
建立联合索引 idx_age_weight
select * from user where age = 11 and weight = 98
5.6之前搜索过程是
在idx_age_weight 索引树中匹配出所有的 age = 11 索引,拿到主键id,回表去一条条再比对weight字段
如下图,需要进行3次回表搜索操作

5.6后的搜索过程是 在idx_age_weight 索引树中匹配出所有的 age = 11 索引,顺便对weight字段进行判断,过滤掉weight = 100的记录,然后再进行回表搜索。
如下图,只需要进行2次回表搜索操作

随缘更新,大神请绕路!
更多精彩内容,欢迎关注微信公众号:囧么肥事 (或搜索:jiongmefeishi)
《MySQL面试小抄》索引考点二面总结的更多相关文章
- 《MySQL面试小抄》索引考点一面总结
<MySQL面试小抄>索引考点一面总结 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟 囧囧表示:面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点!!! ...
- 《MySQL面试小抄》查询缓存机制终面
<MySQL面试小抄>查询缓存机制终面 我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点 ...
- 《MySQL面试小抄》索引失效场景验证
我是肥哥,一名不专业的面试官! 我是囧囧,一名积极找工作的小菜鸟! 囧囧表示:小白面试最怕的就是面试官问的知识点太笼统,自己无法快速定位到关键问题点!!! 本期主要面试考点 面试官考点之什么情况下会索 ...
- MySQL数据库中的索引(二)——索引的使用,最左前缀原则
上文中,我们了解了MySQL不同引擎下索引的实现原理,在本文我们将继续探讨一下索引的使用以及优化. 创建索引可以大大提高系统的性能. 第一,通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性. ...
- php面试专题---16、MySQL创建高性能索引考点
php面试专题---16.MySQL创建高性能索引考点 一.总结 一句话总结: 注意:只写精品 1.索引的基础? 类似书籍的目录:索引类似于书籍的目录,要想找到一本书的某个特定主题,需要先查找书的目录 ...
- php面试专题---17、MySQL的SQL语句编写考点
php面试专题---17.MySQL的SQL语句编写考点 一.总结 一句话总结: 注意:只写精品 1.MySQL的关联UPDATE语句? 关键UPDATE A,B:UPDATE A,B SET A.c ...
- MySQL数据库篇之索引原理与慢查询优化之二
接上篇 7️⃣ 正确使用索引 一.索引未命中 并不是说我们创建了索引就一定会加快查询速度,若想利用索引达到预想的提高查询速度的效果, 我们在添加索引时,必须遵循以下问题: #1 范围问题,或者说条件 ...
- mysql索引之二:数据结构及算法原理
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题.特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BT ...
- 面试官:为什么Mysql中Innodb的索引结构采取B+树?
前言 如果面试官问的是,为什么Mysql中Innodb的索引结构采取B+树?这个问题时,给自己留一条后路,不要把B树喷的一文不值.因为网上有些答案是说,B树不适合做文件存储系统的索引结构.如果按照那种 ...
随机推荐
- c++中new[ ]与delete[ ]的分析
前言 以前对c++的new[]的了解就是开辟一块内存,直到我最近在程序中用到它才发现我的了解太浅. 问题分析 new[]得到的内存空间不会自动初始化 new[]是在堆区中动态分配指定大小的内存,但是这 ...
- 企业CRM系统选型的标准有哪些?
随着市场的发展,企业开始意识到客户的重要性.越来越多的企业形成了"以客户为核心"的理念,更加注重客户数据和管理,因此CRM客户关系管理系统成为企业的首选.选择一个适合企业的CRM系 ...
- JEP 尝鲜系列 3 - 使用虚线程进行同步网络 IO 的不阻塞原理
相关 JEP: JEP 353 Reimplement the Legacy Socket API JEP 373 Reimplement the Legacy DatagramSocket API ...
- OC与Swift混编,三种场景的实现方式
多语言并存时期,混编成为一种必须的方式 ,在多场影中实现OC和Swift语言的并存原来是如此简单 第一种场景,App中实现混编 创建桥接文件*.h 新建一个桥接文件,New File 选择 Heade ...
- istio部署问题Q&A
端口绑定无权限 创建Gateway,提示绑定端口无权限. 2020-12-27T12:25:30.974288Z warning envoy config gRPC config for type.g ...
- [Java] Spring 原理
IOC(Inverse of Control)控制反转 依赖对象的获得被反转了,由自己创建变为从IOC容器获取 优点 代码更简介,不需要new对象 面向接口编程,使用者与具体类解耦,易扩展 方便进行A ...
- 用 set follow-fork-mode child即可。这是一个 gdb 命令,其目的是告诉 gdb 在目标应用调用fork之后接着调试子进程而不是父进程,因为在 Linux 中fork系统调用成功会返回两次,一次在父进程,一次在子进程
GDB的那些奇淫技巧 evilpan 收录于 Security 2020-09-13 约 5433 字 预计阅读 11 分钟 709 次阅读 gdb也用了好几年了,虽然称不上骨灰级玩家,但 ...
- DNS和BIND
https://www.jianshu.com/p/296b2c7ea76f DNS和BIND 毛利卷卷发关注 0.482018.07.25 10:33:44字数 4,919阅读 4,909 DNS ...
- 攻防世界(十三)unserialize3
攻防世界系列 :unserialize3 1.打开题目,反序列化 2.代码审计 类xctf被调用时_weakeup()函数会被自动执行,但当序列化字符串中属性值个数大于属性个数,就会导致反序列化异常, ...
- Maven 阿里云镜像配置
1. 为什么要配置 Maven 阿里云镜像 安装 Maven 后默认是从国外 Maven 中央仓库下载内容,而下载速度简直可以用龟速来形容,不仅慢而且还经常出错,简直让人抓狂. 这时国内大厂阿里巴巴, ...