Mysql索引底层数据结构与算法

常用的数据结构

常用数据结构对比

MyISAM存储引擎(非聚集)

索引文件与数据文件是分离的,叶子节点存储的是MYD磁盘文件的位置指针:

  • frm 定义文件,表的结构
  • MYD 数据文件,存储表的所有数据行
  • MYI 索引文件,存储索引的字段
    执行过程
    请添加图片描述

InnoDB存储引擎(聚集)

InnoDB存储引擎的数据文件是按照B+Tree组织的一个数据结构文件:

  • frm 定义文件,表的结构
  • ibd 存储所有的索引与数据

与MyISAM存储引擎的索引有所不同
1)主键索引的叶子节点存储的是所有的数据
2)非主键索引的叶子节点存储的是主键索引,如果表没有定义主键字段,mysql则存储的是表中有唯一索引的那个字段,如果没有唯一索引,则使用rowid

InnoDB的表必须有主键,并且官方推荐使用整型的自增主键
1.占用空间小,横向能存更多索引
根据B+Tree特性,mysql每一层横向存储索引的大小是16kb,int类型占4个字节,bigint类型占8个字节,每个索引块的指针文件大小占6个字节,因此索引使用int类型占用空间更小,可以存储更多的索引。
2.查找效率更高效
int类型比较大小效率更高,字符类型需要转成ascii码表的值来进行比较,效率慢,而如果使用uuid作为主键,长度为32位,效率更慢
非主键索引存储的是主键索引

  1. 数据的一致性,非主键索引如果存的也是表每一行的全字段数据,就必须保证创建的每个索引存储的值必须一致,这就涉及到事务
  2. 占用空间小

回表

当mysql查询时,根据非主键索引获取主键索引,再通过主键索引定位数据行,这个过程多扫描了一遍索引树,称为回表

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值