Mysql索引学习笔记(Innodb)
- 索引的作用:提高数据查询的效率
- 常见的索引模型:哈希表、有序数组、搜索树
- 哈希表:kv存储,将key通过hash函数算出数组位置,value存储到该位置上,使用链表解决hash冲突,适用于等值查询
- 有序数组:按顺序存储,使用二分查找法快速查询,由于其查询效率较高,更新效率低,适用于数据集中,静态存储引擎,时间复杂度O(log(n))
- 二叉搜索树:每个节点的左子节点值小于右子节点值,时间复杂度O(log(n)),更新时间复杂度O(log(n)),虽然其搜索效率高,但是由于索引不止存储在内存中,还要写进磁盘,如果节点树巨大,树高(n)随之增大,一次查询需要访问n个数据块,从机械硬盘随机读取一个数据块需要10ms寻址,因次查询速度缓慢,因而使用n叉树降低树高,从而减少读取磁盘次数,提高效率
- Innodb搜索引擎:B+Tree
- 索引类型:主键索引,非主键索引,主键索引存储整行的数据(由于按照主键进行排列,是聚簇索引),非主键索引的叶子节点内容是主键的值(也称二级节点)
- 主键设定:主键一般使用非业务逻辑的字段,通常使用自增主键。这是由于在B+Tree算法中,如果新添加一个数据,但是当前数据页存满了,会新加一个数据页,叫做页分裂,并且挪动部分数据到新的数据页中,降低数据页的利用率,大约降低50%。由于自增主键只会在后面添加,不会中间插入,效率高。
- 回表:当我们使用非主键条件查询整行数据时,引擎会先通过这个非主键索引通过B+Tree找到主键,再通过主键索引找到整行数据,这个回到主键索引树搜索的过程就是回表
- 覆盖索引:如果我们只查询主键,而不查询整行数据,这样我们不需要进行回表,从而提升了查询性能,称作覆盖索引
- 联合索引和单个索引:在一个列上建立的索引即单个索引,在多个列上建立的索引是联合索引,当我们对两个非主键字段有高频查询需求时,我们可以建立联合索引,在这个高频请求尚使用到了覆盖索引,不需要回表。
- 最左前缀原则:B+树的特点,利用索引加速检索,可以是联合索引的最左n个字段,也可实时字符串最左的n个字符。在(a,b)上建立索引就不需要在对a建立索引,因此如果调整顺序可以少维护一个索引,优先考虑。当我们需要a,b,(a,b)三个索引,我们优先考虑空间问题,如果a字段更长,建立(a,b),b这两个索引即可
- 索引下推:如果检索名字第一个字是张,而且年龄是 10 岁的所有男孩,select * from tuser where name like '张%' and age=10 and ismale=1;如果索引是(name,age),mysql在5.6前先找到张开头的然后直接进行回表操作,5.6以后会找到张开头的,然后判断age是否为10,再进行回表操作,5.6后减少回表操作的称作索引下推。