mysql中索引的数据结构

索引的本质

索引是帮助MySQL高效获取数据的排好序的数据结构。注意是排好序的数据结构,索引也相当于我们一般书的目录,能够快速的查找需要的内容。

索引存储在哪?

对于不同的存储引擎,索引所存储的位置是不同的。
在mysql中,主要有两种存储引擎: Myisam和Innodb

Myisam存储引擎的数据表中,有三种文件格式,分别是以frm为后缀的表结构文件、以MYD为后缀的数据文件,以MYI为后缀的索引文件;

Innodb存储引擎的数据表中,有两种文件格式,以.frm为后缀的表结构文件、以ibd为后缀的索引与数据合并的文件

myisam索引实现:MyISAM索引文件和数据文件是分离的 非聚集索引
在这里插入图片描述

Innodb索引(聚集索引)
主键索引图:
在这里插入图片描述
非主键索引
在这里插入图片描述
如果查询的是通过 name = Alice 去查询的时候:
走非主键索引去查询,查询完后拿到信息(Alice, 18)。其实这里也是一个非聚簇索引
然后进行回表查询,再次通过主键去查询做回表查询。

联合/复合索引
多个字段组织成一个共同的索引
最左前缀原理为什么这样来使用?
索引的数据是被排序的,如果跳过字段的话是无法被使用的。
在这里插入图片描述
索引的存储结构及其优缺点
mysql索引有B+树索引、Hash索引两种,innoDB默认采取b+树索引

B+Tree(B-Tree)的变种
1.非叶子结点不存储数据,只存储索引(冗余),可以存放更多的索引
2.叶子结点包含所有索引字段
3.叶子结点用指针链接,提高区间访问的性能(可以提升范围查找的效率)

Hash
1.对索引的 key 进行一次 hash 计算就可以定位出数据存储的位置
2.很多的时候 hash 索引要比 B+ 树索引更高效
3.哈希索引只支持等值查询,= in() <=> 不支持where age > 10这种范围查询
4.哈希冲突很多的话,维护索引操作的代价也很高,多个 key 值通过哈希函数计算,是有可能出现计算出同一个结果的情况。这时使用的链表结构。

在这里插入图片描述

为什么 InnoDb 表必须有主键,并且推荐使用整型的自增主键?
1.如果没有设置索引的话,MySQL 会选择一个数据唯一的列作为主键索引, 如果找不这样的列。会去做创建一个隐藏列类似 rowid。
2.因为ibd文件必须要用b+tree来组织,如果有主键,主键自带主键索引,那就可以用主键来组织整张表的数据。
2.整型更方便 B+Tree 排序,自增的话,对于数据结构的存放更快, 顺序存放,不需要进行大量树的平衡操作。

为什么非主键索引结构叶子节点的存储的是主键值?
1.一致性, 让主键索引先成功,然后再去更新非主键索引关系
2.节省存储空间。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值