MySQL索引

MySQL索引

MySQL的索引底层全部是B+树

表名:user

id(auto increment)PKnameagesex
1a20
2b21
3c22
4d23
5e24

 一、InnoDB引擎

根据物理结构区分

聚簇索引

B+树中叶子节点存储的是当前主键id对应行的全部数据,并且叶子节点是双向链表,可以用于范围查询

非聚簇索引

叶子节点存储的是当前索引对应的列值和聚簇索引的值(一般就是主键id)

在age列上面建非聚簇索引

alter table user add index index_age(age);

根据索引列数区分

单列索引

 在age列上面建非聚簇索引

alter table user add index index_age(age);

联合索引

在多个列上面建索引

对name和age建立联合索引:alter table user add index index_age_name(name, age);

对于联合索引来说,先根据name进行排序,在name有序的情况下根据age排序,所以衍生出了最左前缀匹配原则,where中必须包含联合索引的第一个列,才可以使用该联合索引

因为如果没有name,那么age就不能保证有序(虽然这里举的例子,在name没有的时候,age也有序,但是这个属于特例,并且没有name,也不能使用index_age_name索引)

按照特征区分

主键索引(not null, unique, auto increment)

一般使用自增整型作为主键

不使用UUID作为主键的原因:①主键默认是聚簇索引,存储的时候是按照顺序排的,UUID是乱序的,在插入的时候会导致频繁的分页;②UUID所占的内存对比整型来说要更大,所以对相同高度的B+树来说,使用UUID作为主键,存储的数据更少;同时,如果对数据量相同的数据进行存储,那么UUID的树会更高,就意味着查询同一个数据,UUID作为主键的索引需要更多次数的磁盘IO

唯一索引(unique)

可以为空,但是必须保证值是唯一的

普通索引

在普通字段上面建立的索引,不要求非空,也不要求唯一

二、MyISAM存储引擎

只有非聚簇索引,没有聚簇索引,并且非聚簇索引的叶子节点直接存储的是当前行数据存储的物理地址

三、索引为什么使用B+树

哈希索引

只适合等值查询,根据查询条件进行哈希,直接进行定位,在等值查询的时候很快;但是不适合范围查询

B树索引

特点:所有节点里面都存储数据,查找的时间复杂度不确定

因为每一个节点都存储数据,所以在相等高度下的B树和B+树来说,B+树可以存储的数据更多;

并且如果存储的是等量的数据,B+树的高度要小于B树,在查找数据的时候来说,B+树的磁盘IO次数小于B树

总结

B+树存储大量数据的时候,树的高度可控,也就是磁盘IO的次数可控;并且叶子节点在上层都有冗余,所以在删除的时候,需要调整的范围可控

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值