MySQL索引(纯笔记干货)

InnoDB引擎下的MySQL索引

结构默认为B+树,少部分为Hash桶

有聚集索引,非聚集索引之分

加索引后查询效率变快、但是为了维护B+树的稳定,增删改会变慢

主键索引为聚集索引,聚集索引只有一个,索引键值的逻辑顺序和物理顺序一致

聚集索引和非聚集索引之间的关系

非聚集索引和聚集索引一样,采用B+树作为索引,每次给字段建立一条索引,字段中的数据就会被复制出来一份,用于生成新的索引,给表添加太多索引会增加表的体积,占用磁盘存储空间。

非聚集索引和聚集索引的区别在于,聚集索引的B+树叶子结点存储的是所需要查找的数据,而非聚集索引的B+树的叶子结点存储的是该数据行的主键值,查到主键值之后再次通过聚集索引的B+树结构查找所需要的数据,这个操作叫作回表,回表操作的磁盘IO次数必然比不回表多,索引查询效率势必更低一些。 不管以任何方式查询表, 最终都会利用主键通过聚集索引来定位到数据, 聚集索引(主键)是通往真实数据所在的唯一路径。

覆盖索引是非聚集索引之中的特例,覆盖索引的叶子结点存储的就是创建所索引时的关联字段值,所以查到叶子节点的时候,所需要查找的数据也已经出来了,不需要回表操作。 覆盖索引是查询的列可以直接通过索引提取,比如只查询主键的列! 或者查询联合索引的所有列或者左边开始的部分列(注意有顺序的) 而联合索引并不一定只从索引中能获取到所有的数据,这个取决于你所查询的列。

什么时候加索引

(1)列经常被用于where条件中

(2)列中有大量的空值

(3)表几乎没有被修改

(4)数据量很大,只有2-4%的数据被选出来

什么时候索引会失效

(1)对列进行计算或者是使用函数,则该列的索引会失效

(2)不匹配数据类型,会造成索引失效

(3)where语句中使用了IS NULL或者IS NOT NULL,会造成索引失效

(4)使用了反向操作,该索引将不起作用

(5)使用了link操作,索引就将不起作用

(6)在WHERE中使用OR时,有一个列没有索引,那么其它列的索引将不起作用

为什么InnoDB存储引擎索引结构默认是B+树而不是B树?

B+树相对于B树更加矮胖,查询效率稳定,由于所有值都存储在叶子结点,并且叶子结点之间存在双向指针,使得范围查询更容易

为什么默认为B+树而不是Hash桶?

B+树支持范围查询,Hash索引只支持单点查询,在很多业务逻辑中都需要使用到范围查询的情况

三层B+树结构能够载入多少数据?是否需要四层?
B+树的阶数是怎么计算的,B+树的层高是怎么计算的?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值