共计 2168 个字符,预计需要花费 6 分钟才能阅读完成。
一、前置常识
1、常见索引面试题
▪ 数据库中最常见的慢查问优化形式是什么?
▪ 为什么加索引能优化慢查问?
▪ 你晓得哪些数据结构能够进步查问速度?
▪ 那这些数据结构既然都能优化查问速度,Mysql 为何抉择应用 B + 树?
2、基础知识储备
▪ 局部性原理
▪ 磁盘预读(预读的长度个别为页(page)的整数倍)
– 页是存储器的逻辑块,操作系统往往将主存和磁盘存储区宰割为间断的大小
相等的块,每个存储块称为一页(在许多操作系统中,页大小通常为 4k),
主存和磁盘以页为单位替换数据。
3、mysql 执行流程
二、索引
1、索引是什么
▪ 索引是帮忙 MySQL 高效获取数据的数据结构
▪ 索引存储在文件系统中
▪ 索引的文件存储模式与存储引擎无关
2、索引文件的构造
hash
哈希表能够实现索引的存储,每次在增加索引的时候须要计算指定列的 hash 值,取模运算后计算出下标,将元素插入下标地位即可
适宜的场景:等值查问
表中的数据是无序数据(返回查找的时候比拟浪费时间,须要挨个进行遍历操作)
返回查找不适合
hash 表在应用的时候,须要将全副数据加载到内存,比拟消耗内存的空间,也不是很适合
树
在树的构造中,左子树必须小于双亲节点,右子树必须大于双亲节点,如果是多叉树,从左到右是有序的
树:多叉树 -> 二叉树(二分查找)->AVL 树(均衡树)-> 红黑树
AVL 树:是一种严格意义上的均衡树,最高子树跟最低子树高度只差不能超过 1,因而在进行元素插入的时候,会进行 1 到 N 此旋转,重大影响插入的性能
红黑树:是基于 AVL 树的一个降级,损失了局部查问的性能,来晋升插入的性能,在红黑树中最低子树跟最高子树之差小于 2 倍即可,在插入的时候不须要进行 N 屡次的旋转操作,而且还退出了变色的个性,来满足插入和查问的性能的均衡
二叉树及其 N 多的变种,都不能撑持索引,要么是树的深度无法控制,要么是
B 树
所有键值散布在整颗树种
搜寻有可能在非叶子节点完结,在关键字选集内做一次查找,性能迫近二分查找
每个节点最多领有 m 个子树
根节点至多有 2 个子树
分支节点至多领有 m / 2 颗子树(除根节点和叶子节点外都是分支节点)
所有叶子节点都在同一层,每个节点最多能够有 m - 1 个 key,并且升序排列
毛病:
1、每个节点都有 key,同时也蕴含 data,而每个页存储空间是无限的,如果 data 比拟大的话会导致每个节点存储的 key 数量变小
2、当存储的数据量很大的时候会导致树的深度较大,增大查问时磁盘的 IO 次数,进而影响查问性能
B+ 树
B+ 树是在 B 树的根底之上做的一种优化,变动如下
(1)B+Tree 每个节点能够蕴含更多的节点,这么做的起因有两个,第一个是为了升高树的高度,第二个是将数据范畴变为多个区间,区间越多,数据检索越快
(2)非叶子节点存储 key,叶子节点存储 key 和数据
(3)叶子节点两两指针相互连接(合乎磁盘的预读个性),程序查问性能更高
3、索引的分类
▪ mysql 索引的五种类型:主键索引、惟一索引、一般索引和全文索引、组合索引。通过给字段增加索引
能够进步数据的读取速度,进步我的项目的并发能力和抗压能力。
主键索引
– 主键是一种唯一性索引,但它必须指定为 PRIMARY KEY,每个表只能有一个主键。
惟一索引
– 索引列的所有值都只能呈现一次,即必须惟一,值能够为空,惟一索引不会回表。
一般索引
– 根本的索引类型,值能够为空,没有唯一性的限度。(笼罩索引)
全文索引,MyISAM 反对,Innodb 在 5.6 之后反对
– 全文索引的索引类型为 FULLTEXT。全文索引能够在 varchar、char、text 类型的列上创立
组合索引
– 多列值组成一个索引,专门用于组合搜寻(最左匹配准则)
4、Mysql 存储引擎
不同的存储引擎,数据文件和索引文件寄存的地位是不同的,因而有了分类:
聚簇索引:数据和文件放在一起:InnoDB
.frm: 寄存的是表构造
.ibd: 寄存的是数据文件和索引文件
留神:mysql 的 InnoDB 存储引擎默认状况下会把所有的数据文件放到表空间中,不会为每一个独自的表保留一份数据文件,如果须要每一个表独自应用文件保留,设置如下属性:set global innodb_file_per_table=on;非聚簇索引:数据和文件分凋谢:MyISAM
.frm: 寄存表构造
.MYI: 寄存索引数据
.MYD: 寄存理论数据
5、mysql 索引机制
6、索引难点
回表
1、InnoDB 是通过 B + 树结构对主键创立索引,而后叶子节点种存储记录,如果没有主键,那么会抉择惟一键,如果没有惟一键,那么会生成一个暗藏的 6 位的 row_id 来作为主键
2、如果创立索引的列是其余字段,那么在叶子节点中存储的是该记录的主键,而后再通过主键找到对应的记录,叫做回表
3、MyISAM: 不存在回表问题,起因是 MySIAM 存储引擎,索引文件和数据文件是离开寄存的,在 B + 树的叶子节点存储的是数据行所在的磁盘地址,一般索引也是如此,所以不存在回表问题
笼罩索引
1、针对 InnoDB, 笼罩索引是指,如果查问的时候用到的是一般索引,而查问的列正好是主键 id,那么在一般索引的 B + 树中叶子节点存储的正好就是主键 id,间接返回即可,便不须要再去主键索引的 B + 树中遍历
最左前缀
1、最左前缀,是指应用组合索引的时候,必须从左到右顺次匹配索引列
索引下推
参考 https://zhuanlan.zhihu.com/p/121084592