深入解析MySQL索引数据结构


当前第2页 返回上一页

查询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 去查询的时候:

  1. 走非主键索引去查询,查询完后拿到信息(Alice, 18)。其实这里也是一个非聚簇索引
  2. 然后进行回表查询,再次通过主键去查询做回表查询。

两个数据文件:

.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如何设置单表大小

关于mysql explain中key_len的计算方法讲解

[深度liunx系统]安装数据库mysqlmysql workbench

在cnetos7上搭建mysql主从服务

mysql在开发和生产不同环境下的索引对比

关于mysql互换表中两列数据方法的讲解

mysql多表关联更新

设计性能更优mysql数据库schema

centos7安装mysql的教程(详细)

mysql如何挂盘

更多相关阅读请进入《mysql》频道 >>


数据库系统概念 第6版
书籍

数据库系统概念 第6版

机械工业出版社

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



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...