当前位置:网站首页>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 域。
所以非主键索引要做一次回表操作 通过获取到的主键再去定位一遍
边栏推荐
- C# 枚举类型 于xaml 中区别
- 概率论的学习整理4:全概率公式
- Testability of Fuzzy Discrete Event Systems
- 概率论的学习和整理7:理解期望和方差还是要回到随机试验本身,期望不是平均值,方差的公式不同情况不同
- decodeURIComponent(), eval(), encodeURIComponent()
- mapbox-gl开发教程(十四):画圆技巧
- The use and principle of distributed current limiting reduction RRateLimiter
- saltstack学习2grains&pillar
- OneNote如何修改已有的笔记本为默认的快速笔记?
- 概率论的学习整理5:贝叶斯(bayes)法则和贝叶斯概率
猜你喜欢
随机推荐
24. 两两交换链表中的节点
Flexible distribution parameters of mechanical system modeling and control of research and development
基于声信道分析的电缆隧道人员定位技术
Homework 7.29 correlation function directory and file attributes related functions
不用if分支对同一个变量做判断的方法
亚洲高校首现KDD博士论文奖:清华裘捷中获Runner Up奖,WINNER奖也是位华人
关于File文件的相关知识
The use and principle of distributed current limiting reduction RRateLimiter
Kubernetes之本地存储
数字量输入输出模块DAM-5088
EXCEL解决问题:如何查找目标区域,是否包含指定字符串?
Transfer Learning Technology Training
[Cloud-Building Co-creation] Huawei Cloud and Hongmeng collaborate to cultivate innovative developers
Verilog grammar basics HDL Bits training 07
看了这些6G原型样机,我想一觉睡到2030年
Rust 从入门到精通02-安装
云原生应用的概念和云原生应用的 15 个特征
IO/multiplexing (select/poll/epoll)
SQL 根据时间范围查询数据
JD.com was brutally killed by middleware on two sides. After 30 days of learning this middleware booklet, it advanced to Ali.









![[SCTF2019]Flag Shop](/img/26/20e21ec873f41f2633703216453a44.png)