mysql实战45讲学习笔记-04深入浅出索引

– 仅供自己学习参考

mysql 索引

一,索引模型

1. 哈希索引

 	a. 哈希索引适用于key,value的查找方式,类似redis,对应的搜索引擎有memory,通过对一个key进行hash计算,找到对应的value,可以很快的进行单个查找。
 	b. 解决hash冲突的办法还是常用的解决方式,拉链法,扩大地址空间等
 	c. hash索引在区间查找的效率并不高,需要全表扫描
 	d. 优点就是插入删除不需要移动其他数据,不需要连续的存储块

2. 有序数组索引

	a. 有序数组索引是查询效率非常高的索引结构,因为有序,所以直接使用二分法,就可以在O(logN)的时间复杂度内
	就可以找到我们需要的值
	b. 有序数组索引因为是连续的存储块,所以在新增和删除时需要移动相应的记录,这个效率非常慢
	c. 所以有序数组索引适用于一些静态数据,这些数据需具备几乎不会修改的特性。

3. 搜索树索引

	a. 搜索树索引一般常见的就是二叉树,B+树等
	b. 二叉树的特点就是左子节点比父节点小,右子节点比父节点大,查询时间复杂度为:O(log(N))
	c. 为了保证二叉树的平衡,使其不退化成链表,需要对其进行更新,这就是平衡二叉树,它更新的时间复杂度也是O(log(N))
	d. 一般不会直接使用二叉树作为存储引擎,因为Mysql数据一般都是落磁盘的,当一个二叉树的树比较高的时候,需要读取磁盘数据块的次数也就越多,从磁盘读取比较耗时,我们需要尽量减少这种操作。
	e. 所以一般会采用N叉树,下面会进行讲解

Innodb 索引模型

一,主键索引、普通索引,聚簇索引,覆盖索引名词解释

a. 主键索引:innodb中如果可以手动声明一个字段为主键索引,存储时会以主键为key,整行记录为value进行存储,
如果没有声明主键,则尝试用唯一键,如果再没有,则会使用6字节,48位生成一个隐式的主键id。通过主键查询,
可以直接查到对应的整行记录

b. 普通索引:普通索引就是用index声明的方式,他的value存储的是主键。每次通过index进行查询都是先查询到
主键id,再由主键id查询到对应的值。所以普通索引又被称为二级索引,这种查询方式叫做回表

c. 聚簇索引: 因为innodb中,主键索引叶子结点存储的都是整行记录,所以主键索引也被叫做聚簇索引

d. 覆盖索引:如果一个索引覆盖了select的列和查询的条件,这个时候索引既存储了主键的id,也存储了索引列的值,
此时如果查询列和条件列刚好都命中索引,那么则可以直接返回需要的数据,不需要进行回表查询。

二,innodb 存储方式

1, innodb采用了b+树的索引方式进行存储、查询。表是根据主键顺序以索引的形式存放的,这种存储形式称之为
   索引组织表。

2,每一个索引在innodb中都对应一个B+树,那么一张表中可能存在多个B+树,一个主键索引的B+树,以及多个
  非主键索引的B+树。如果未建立索引,查询时则从主键索引的叶子结点遍历扫描

三,索引维护

1,B+树为了维护索引的有序性,在插入新值的时候需要做必要的维护。如果是自增的主键,则直接往后面追加。
  如果是非自增主键,则无法保证插入的有序性。
2,如果在挪动数据时,数据页已满,则会产生页分裂,页分裂可能会导致页错位,产生较多的页碎片。
3,页合并指的是当你在数据库中删除一条记录时,他并不会真正的进行删除,也是将该记录标记为已删除并且可回收,
  当一个页删除足够的数据达到合并阈值时,会找相邻的页尝试页合并,从而优化空间使用率。
4,所以为了更好的维护索引,主键尽量使用自增,从而减少页分裂。

四,索引优化方式
1. 最左前缀原则

 1,索引项是根据索引对应列的顺序进行排序的,所以通过索引查询都是顺序查询。
 2, 建立联合索引后,mysql会根据词法分析建立最左子树的,查询时也是遵循从左到右的方式。
 3, 如果建立了index(a, b)的联合索引,只查询a,也是可以使用到索引的,或者单个索引 x 下, where x like "吴%",
   也可以使用到最左前缀。
 4, 建立索引是一个需要根据实际情况仔细评估的过程,需要根据查询的高频字段,字段大小等来决定

2,索引下推

索引下推主要是为了减少回表次数,先根据索引找到对应的数据,跟过滤掉不满足条件的数据,然后将剩余的数据进
行回表查询,这样可以避免全部回表查询
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值