查询mysql 索引的数据页的大小:
mysql> show global status like 'Innodb_page_size'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | Innodb_page_size | 16384 | +------------------+-------+
为什么设置 16kb 呢?
Hash
- 对索引的 key 进行一次 hash 计算就可以定位出数据存储的位置
- 很多的时候 hash 索引要比 B+ 树索引更高效
- 仅能满足 “=” , “in” 不支持范围查询
- 存在 hash 冲突问题
Hash 数据结构.png
索引
InnoDB 索引实现(聚集)
表数据文件本身就是按 B+Tree 组织的一个索引结构文件
聚集索引-叶子节点包含了完整的数据记录
为什么 InnoDb 表必须有主键,并且推荐使用整型的自增主键?
- 如果没有设置索引的话,MySQL 会选择一个数据唯一的列作为主键索引, 如果找不这样的列。会去做创建一个隐藏列类似 rowid。
- 表数据文件按照 B+Tree 的数据结构维护,在叶子节点维护的是该行的数据。所以必须有主键。
- 整型更方便 B+Tree 排序,自增的话,对于数据结构的存放更快, 顺序存放,不需要进行大量树的平衡操作。
为什么非主键索引结构叶子节点的存储的是主键值?
- 一致性, 让主键索引先成功,然后再去更新非主键索引关系
- 节省存储空间。
主键索引示意图:
InnoDB 索引实现.png
非主键索引示意图图片
如果查询的是通过 name = Alice 去查询的时候:
- 走非主键索引去查询,查询完后拿到信息(Alice, 18)。其实这里也是一个非聚簇索引
- 然后进行回表查询,再次通过主键去查询做回表查询。
两个数据文件:
.frm 主要是存储表结构信息
.ibd 主要是存储索引和数据
MyISAM 索引文件(非聚集)
索引文件和数据文件是分离的(非聚集)
MyISAM 存储引擎索引.png
三个数据文件:
.frm 数据结构文件
.myd 文件主要是存储数据
.myi 文件主要是存储索引信息
聚集索引和非聚集索引
特征:
聚集/非聚集主要是索引文件是否和数据文件在一起。
查询效率上来说聚集索引不会跨文件查询效率会更加快。
联合/复合索引
多个字段组织成一个共同的索引
组合索引.png
最左前缀原理为什么这样来使用?
索引的数据是被排序的,如果跳过字段的话是无法被使用的。
示例:
where name = 'Jeff' and age = 22 -- 命中索引 where age = 30 and postatin='manager' -- 不命中索引 where postation = 'dev' -- 不命中索引
参考资料
百度百科
总结
到此这篇关于MySQL索引数据结构的文章就介绍到这了,更多相关MySQL索引数据结构内容请搜索
更多Mysql内容来自木庄网络博客
标签:Mysql
相关阅读 >>
关于mysql explain中key_len的计算方法讲解
[深度liunx系统]安装数据库mysql和mysql workbench
更多相关阅读请进入《mysql》频道 >>

数据库系统概念 第6版
本书主要讲述了数据模型、基于对象的数据库和XML、数据存储和查询、事务管理、体系结构等方面的内容。