MySQL引擎数据结构与B+Tree

看高性能Mysql一书简单总结下引擎区别及B+Tree等索引数据结构及底层原理

1. MySQL常见引擎

  • Innodb
  • Myisam
  • Memory
  • MaraiDB
区别 Innodb Myisam
存储文件(data目录) .frm 表定义文件 idb 数据文件
.frm 表定义文件 .myd 数据文件 .myi 索引文件
表锁、行锁 表锁
事务 ACID
CRDU 插入、修改、删除
Count 扫表 专门存储行数
存储 B+Tree B+Tree

2. 底层数据、索引存储结构

  • 数据始终存在硬盘上,传统IO机械运动需要找到存储所在对应的柱面扇区磁道,最大可能100ms
  • 操作系统使用IO优化页缓存,将连续的一个Page数据读取进入内存备用

    page=4查找到16只需要4次磁盘IO

B+Tree

  1. 数据是存储在叶子结点
  2. 数据节点之间有指针指向

度:针对一个节点,有几个子女这个节点的度数就是几
高度:从根到叶最长的距离就叫高度
一个B+Tree的高度=磁盘IO的次数,即上图的磁盘IO次数需要3次;可以分析出只需要降低树的高度=减小磁盘IO次数
降低高度后查询所有值得IO次数都为2次

索引

上面的表格中已经知道Myisam存储的文件是将数据文件索引文件分开存储的,索引文件中仅存的是数据文件的地址

Innodb将主键索引及数据文件存储在一起(聚簇索引

而普通索引则是单独的一份文件,索引结构中仅保存主键的ID,通过ID再去聚簇索引中查询对应的记录(非聚簇索引

为什么使用UUID会严重影响性能?
索引查找慢、存储量大、插入删除旋转树非常损耗非常大。所以使用自增主键ID