Mysql索引以及底层原理

索引

索引是一种帮助Mysql提高查询效率的数据结构。
缺点:维护索引需要耗费数据库资源,也会占用磁盘空间,会影响curd的速率
总的来说 并不是索引建立的越多越好。

索引有四种

1.主键索引
当我们创建主键的时候会默认创建主键索引,innodb聚簇索引

2.普通索引(非聚簇索引)
一个索引只包含单个列,两种方式创建普通索引,建表时和建表后
建表时创建的索引的索引名默认是字段名
Create table ff (id int primary key,name varchar(20),key(name));
建表后创建的索引可以自定义索引名字
Create index 索引名字 on 表名(字段) ; Create index name_index on ff(name);

3.唯一索引
索引列的值必须唯一,但允许有空值 ,也可以建表时和建表后创建唯一索引
Create table ff(id int primary key,name varchar(20),unqiue(name));
Create unique index 索引名字 on 表名(字段)

4.复合索引
一个索引包含多个列,也可以建表时和建表后创建
Create table ff (id int primary key,name varchar(20),name2 varchar(20),name3 varchar(20)key(name,name2,name3));
Create index index_name on ff(name,name2,name3)
复合索引查询的时候 遵循一个最左前缀原则,然后会动态调整查询字段的顺序

查询索引的sql语句:show index from 表名
删除索引的sql语句:drop index 索引名 on 表名

索引的底层原理

插入数据的时候主键索引会自动进行排序,插入id 3 5 2 1 4 查询的时候就是1 2 3 4 5
在这里插入图片描述

绿色的是主键索引,橙色的是主键索引对应的数据,蓝色的P是指针,这其实是一个链表
主键索引在我们每次插入数据的时候会进行一个排序,并且会通过指针一个个连接起来。
这样这个数据结构的时间复杂度就是On了

MySQL优化这个链表,会对这些数据进行分页,每一页的大小默认为16kb,然后再做一个页目录,页目录也是页,默认大小为16kb。
页目录只存储每一页的第一个主键索引和指针,这个指针指向的是对应的页。
在这里插入图片描述
一个int类型占4个字节varchar(20)占20个字节,指针占4-8个字节

B+树

什么是B+树,B+树是一种树类型的数据结构,由B树优化而来
B树和B+树最大的区别是B树的非叶子结点也必须存储数据,B+树只在叶子结点存储数据

B+树的优点是只有叶子结点存储数据,非叶子结点只存储键值,叶子结点图中就是最下面那一层。
B树的非叶子结点必须存储数据,这样会导致非叶子结点存储的数据变少,导致树的深度也会更深

B+树和B树的最顶层的根结点常驻与内存的,所以三层B+树只需要2次读写IO
在这里插入图片描述
在这里插入图片描述

聚簇索引和非聚簇索引

在这里插入图片描述

聚簇索引查询的时候会将数据元素放在缓存里,下一次查询就会比较快。
非聚簇索引索引是指向物理地址的,每次查询的时候都是从物理地址上读取。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值