当前位置:网站首页>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 域。
所以非主键索引要做一次回表操作 通过获取到的主键再去定位一遍
边栏推荐
- 解码Redis最易被忽视的CPU和内存占用高问题
- contentDocument contentWindow, canvas, svg, iframe
- LeetCode_236_Last Common Ancestor of a Binary Tree
- [SCTF2019]Flag Shop
- Reverse linked list - iterative inversion method
- saltstack学习1入门基础
- 基于加权灰色关联投影的Bagging-Blending多模型融合短期电力负荷预测
- 看了这些6G原型样机,我想一觉睡到2030年
- Explain the problem of change exchange in simple terms - the shell of the backpack problem
- CMake库搜索函数居然不搜索LD_LIBRARY_PATH
猜你喜欢

Kubernetes之本地存储

PyQt5快速开发与实战 8.4 设置窗口背景 && 8.5 不规则窗口的显示

C# 枚举类型 于xaml 中区别

超图iServer rest服务之最佳路径分析

反转链表-迭代反转法

Redis 主从复制

明德扬FPGA开发板XILINX-K7核心板Kintex7 XC7K325 410T工业级

Homework 7.29 correlation function directory and file attributes related functions

Vivado安装后添加器件库

Unity Beginner 6 - Simple UI production (blood bar production) and audio addition and NPC dialogue bubbles (2d)
随机推荐
刷屏了!!!
Kubernetes 入门实战03 中级篇
Interviewer: Redis bloom filter and the cuckoo in the filter, how much do you know?
Based on MySQL database, Redis cache, MQ message middleware, ES high availability scheme of search engine parsing
The use and principle of distributed current limiting reduction RRateLimiter
LeetCode_235_二叉搜索树的最近公共祖先
unity初学6——简易的UI制作(血条制作)和音频加入以及NPC的对话气泡(2d)
Get the original data API on 1688app
【32. 图中的层次(图的广度优先遍历)】
AlphaFold预测了几乎所有已知蛋白质!涵盖100万物种2.14亿结构,数据集开放免费用...
Breaking the principle and introducing SQL, what does MongoDB want to do???
[BJDCTF2020]Cookie is so stable-1|SSTI injection
打破原则引入SQL,MongoDB到底想要干啥???
电脑奔溃的时候,到底发生了什么?
和数集团:让智慧城市更智慧,让现实生活更美好
contentDocument contentWindow, canvas, svg, iframe
Matlab绘图(1)——二维绘图
mapbox-gl开发教程(十四):画圆技巧
Manage reading notes upward
云原生应用的概念和云原生应用的 15 个特征