一、前置常识
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