当前位置:网站首页>Mysql索引结构
Mysql索引结构
2022-07-30 11:59:00 【也拟泛轻舟~】
在 MySQL 中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论 MyISAM 和 InnoDB 两个存储引擎的索引实现方式。
MyISAM 索引实现
MyISAM 引擎使用 B+Tree 作为索引结构,叶节点的 data 域存放的是数据记录的地址。下图是 MyISAM 索引的原理图:
这里设表一共有三列,假设我们以 Col1 为主键,则图 8 是一个 MyISAM 表的主索引(Primary key)示意。可以看出 MyISAM 的索引文件仅仅保存数据记录的地址。
在 MyISAM 中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主索引要求 key 是唯一的,而辅助索引的 key 可以重复。如果我们在 Col2 上建立一个辅助索引,则此索引的结构如下图所示
同样也是一颗 B+Tree,data 域保存数据记录的地址。因此,MyISAM 中索引检索的算法为首先按照 B+Tree 搜索算法搜索索引,如果指定的 Key 存在,则取出其data 域的值,然后以 data 域的值为地址,读取相应数据记录。
InnoDB 索引实现 (B+Tree 作为索引结构)
1、非叶子节点不存储data 只存储索引 可以放更多的索引
2、并且每个索引后面都会跟有一个指向下一页的指针,提高区间访问的性能
3、叶子节点包含所有索引字段*
** innodb只会有一个聚集索引 如果建立了主键 主键就是聚集索引
叶节点包含了完整的数据记录 也就是索引所在行的整行数据**
首先我们来看下一颗层高为3的b+树可以存放多少条数据
mysql页默认大小16k,如果数据行大小1k,叶子节点存放的完整数据,则叶子节点一页可以放16条数据;非叶子节点页面存放的是主键和指针,所以主要看主键是啥类型,假设是long,则长度8字节,指针大小在innodb是6字节,一共14字节,所以非叶子节点每页可以存16384/14=1170个主键数据(1170个分叉),则三层b+树数据可以存1170117016=21902400条数据。(千万级别)
首先我们要认识到索引是排好序的
主键索引:

上图是 InnoDB 主键索引(同时也是数据文件)的示意图,叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为 InnoDB 的数据文件本身要按主键聚集
InnoDB 要求表必须有主键(MyISAM 可以没有),若未建立主键 数据库选择所有数据不相同的列建立b+tree 如果所有列都不符合 那么mysql会建立一个隐藏列来维护数据(rowid)
尽量在 InnoDB 上采用自增字段做表的主键
首先整型的大小容易比较 uuid需要通过asc码逐一比较 整型的索引占用空间比较小
若使用非自增 后续插入可能在已放满的索引页里新增数据 会造成索引页分页 还有就是非页子节点索引的一个重新平衡 消耗性能。
如果表使用自增主键,那么每次插入新的记录,记录就会顺序添加到当前索引节点的后续位置,当一页写满,就会自动开辟一个新的页
辅助索引:
辅助索引 data 域存储相应记录主键的值而不是地址。换句话说,InnoDB 的所有辅助索引都引用主键作为 data 域。
所以非主键索引要做一次回表操作 通过获取到的主键再去定位一遍
边栏推荐
- 从“校园贷”到“直播带货”,追风少年罗敏一直行走在风口浪尖
- 嵌入式环境下并发控制与线程安全
- 限时招募!淘宝无货源副业,800/天,不限经验,男女皆可,仅限前200名!
- 如何用Golang来手撸一个Blog - Milu.blog 开发总结
- Unity Beginner 6 - Simple UI production (blood bar production) and audio addition and NPC dialogue bubbles (2d)
- LinkedList与链表
- Summary of text alignment, line height, space, etc.
- 概率论的学习和整理7:理解期望和方差还是要回到随机试验本身,期望不是平均值,方差的公式不同情况不同
- 刷屏了!!!
- Horizontal comparison of 5 commonly used registration centers, whether it is used for interviews or technical selection, is very helpful
猜你喜欢

nodeJs--fs模块

11 年膨胀 575 倍,微信为何从“小而美”变成了“大而肥”?

刷屏了!!!

EXCEL解决问题:如何查找目标区域,是否包含指定字符串?
![[SCTF2019]Flag Shop](/img/26/20e21ec873f41f2633703216453a44.png)
[SCTF2019]Flag Shop

JD.com was brutally killed by middleware on two sides. After 30 days of learning this middleware booklet, it advanced to Ali.

来n遍剑指--04. 二维数组中的查找

亚洲高校首现KDD博士论文奖:清华裘捷中获Runner Up奖,WINNER奖也是位华人

2022-07-29 顾宇佳 学习笔记 异常处理

Horizontal comparison of 5 commonly used registration centers, whether it is used for interviews or technical selection, is very helpful
随机推荐
概率论的学习整理4:全概率公式
Difference between C# enumeration type and xaml
Unity Beginner 6 - Simple UI production (blood bar production) and audio addition and NPC dialogue bubbles (2d)
概率论得学习整理--番外3:二项式定理和 二项式系数
英 文 换 行
[SCTF2019]Flag Shop
Niuke-TOP101-BM42
The method of judging the same variable without the if branch
CMake库搜索函数居然不搜索LD_LIBRARY_PATH
【32. 图中的层次(图的广度优先遍历)】
Apifox 生成接口文档 教程与操作步骤
[Cloud-Building Co-creation] Huawei Cloud and Hongmeng collaborate to cultivate innovative developers
亚洲高校首现KDD博士论文奖:清华裘捷中获Runner Up奖,WINNER奖也是位华人
Get the original data API on 1688app
云原生应用的概念和云原生应用的 15 个特征
EXCEL解决问题:如何查找目标区域,是否包含指定字符串?
备战金九银十!2022面试必刷大厂架构面试真题汇总+阿里七面面经+架构师简历模板分享
PyQt5快速开发与实战 8.4 设置窗口背景 && 8.5 不规则窗口的显示
Kubernetes之本地存储
Vivado安装后添加器件库