深入理解Mysql(一)
索引数据结构
索引是帮助Mysql高效获取数据的排好序的数据结构
- 二叉树
- 红黑树
- Hash表
- B-Tree
B-Tree
B+Tree
- 非叶子节点不存储data,只存储索引(冗余),可以放更多的索引
- 叶子节点包含所有索引字段
- 叶子节点用指针连接,提高区间访问性能
[图片侵删]
Mysql的每个节点的大小为
SHOW GLOBAL STATUS LIKE ‘Innodb_page_size’;
Mysql的数据文件存储位置
Windows
在mysql目录下的data文件夹
linux
打开/etc/my.cnf 或 /etc/mysql/my.cnf,查看data的配置路径
Mysql的存储引擎
子节点中存储一条记录中的所有信息。innodb和myisam是基于数据库表结构的概念,指的是数据库表的存储结构模型
InnoDB
文件后缀
MySQL 使用 InnoDB 存储表时,会将表的定义和数据索引等信息分开存储,其中前者存储在 .frm
文件中,后者存储在 .ibd
文件中
在mysql8.0后,对文件结构进行了大概,.frm文件不存在了,而是将表的结构存放在元数据表mysq子节点中存储一条记录中的所有信息。l.ibd
中,目的是为了保证在server crash的情况下,不会遗留.frm .ibd临时文件,保证了DDL操作的原子性
存储实现
磁盘管理的最小单位页
页的大小可以通过修改Innodb_page_size
属性来实现,修改了页的大小后,相应的分配的存储分区大小也会因此改变
[图片侵删]
底层采用的是聚集索引,即索引关键字和数据一起存放
数据结果
InnoDB 存储引擎中的表都是使用索引组织的,也就是按照键的顺序存放;聚集索引就是按照表中主键的顺序构建一颗 B+ 树,并在叶节点中存放表中的行记录数据。
如果使用上面的 SQL 在数据库中创建一张表,B+ 树就会使用 id
作为索引的键,并在叶子节点中存储一条记录中的所有信息。
[图片侵删]
Myisam
Myisam采用的是辅助索引,但是它的叶节点并不包含行记录的全部数据,仅包含索引中的所有键和一个用于查找对应行记录的书签,在 InnoDB 中这个书签就是当前记录的主键。