一次性理清楚 索引,尤其是 “聚焦索引”

索引是什么?    索引能干什么?

索引是帮助MySQL高效获取数据的数据结构;提高数据查询的效率。

一、索引的分类

1. 从存储结构(索引存储时保存的形式)上来划分:

                 BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。

2. 从应用层(使用过程中进行的分类)次来分:

                 普通索引(即该列(字段)的值 可以重复,MUL,multiply(多个));

                 唯一索引(索引列的值必须唯一,不允许出现重复,但允许为空NULL,UNI,unique(独一无二));

                 复合索引(即一个索引包含多个列)。

3. 从数据的物理顺序与键值的逻辑(索引)顺序关系:

                 聚集索引(定义:表的物理顺序与键值的索引顺序一致;由于聚集索引规定数据在表中的物理存储顺序,因此一个表只能包含一个聚集索引,但该索引可以包含多个列(组合索引。类似于复合索引);并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行;(主键,即值不能重复,且不能为空的索引,是建立了唯一的聚集或者非聚集索引)。

                 非聚集索引

 

二、索引的底层实现

 

问:为什么索引结构默认使用B-Tree,而不是hash,二叉树,红黑树?

hash:虽然可以快速定位,但是没有顺序,IO复杂度高。二叉树:树的高度不均匀,不能自平衡,查找效率跟数据有关(树的高度),并且IO代价高。

红黑树树的高度随着数据量增加而增加,IO代价高。

问:为什么官方建议使用自增长主键作为索引。

结合B+Tree的特点,自增主键是连续的,在插入过程中尽量减少页分裂,即使要进行页分裂,也只会分裂很少一部分。并且能减少数据的移动,每次插入都是插入到最后。

总之就是减少分裂和移动的频率。

插入连续的数据:                                                          插入非连续的数据:

      

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深耕AI

谢谢鼓励~我将继续创作优质博文

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值