MySQL之MyISAM存储引擎的非聚簇索引详解


Posted in MySQL onMarch 03, 2022

在InnoDB中索引即数据,也就是聚簇索引的那颗B+树的叶子节点中已经包含了所有完整的用户记录。MyISAM的索引方案虽然也是使用树形结构,但是却将索引和数据分开存储,这种索引也叫非聚簇索引。

create table index_demo(
	c1 int,
	c2 int,
	c3 char(1),
	primary key(c1)
) ROW_FORMAT=COMPACT;

将表中的记录按照记录的插入顺序单独存储在一个文件中,这个文件并不划分为若干个数据页,有多少记录就往这个文件中塞多少个记录,这样一来,我们就可以通过行号快速访问到一条记录。在表中使用MyISAM作为存储引擎时,它的记录在存储空间中的表示如图:

MySQL之MyISAM存储引擎的非聚簇索引详解

由于在插入数据时并没有刻意按照主键大小排序,所以我们不能再这些数据上使用二分法进行查找,使用MyISAM存储引擎的表会把索引信息单独存储在另外一个文件中,称为索引文件。MyISAM会为表的主键单独创建一个索引,只不过在索引的叶子节点中存储的不是完整的用户记录,而是主键值和行号的组合。也就是先通过索引找到对应的行号,再通过行号去找对应的记录。

MySQL之MyISAM存储引擎的非聚簇索引详解

在InnoDB存储引擎中,我们只需要根据主键值对聚簇索引进行一次查找就能找到对应的记录;在MyISAM存储引擎中,需要进行一次回表操作,这也意味着MyISAM中建立的索引相当于全部都是二级索引。

MyISAM会直接在索引叶子节点处存储该条记录在数据文件中的地址偏移量。由此可以看出MyISAM的回表操作时十分快速的,因为它是拿着地址偏移量直接到文件中取数据,而InnoDB是通过获取主键之后再去聚簇索引中找记录,虽然说不慢,但是也比不上直接用地址去访问。

如果有必要,我们也可以为其他列分别建立索引或者建立联合索引,其原理与InnoDB中索引差不多,只不过在叶子节点处存储的是相应的列+行号,这些索引页全部都是二级索引。

MySQL之MyISAM存储引擎的非聚簇索引详解

可以看到对于非聚簇索引,不管是以主键为排序规则还是以非主键为排序规则,它的结构都是相同的,即叶子节点存放的都是相应的列+行号。

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注三水点靠木的更多内容! 

MySQL 相关文章推荐
mysql字符串截取函数小结
Apr 05 MySQL
mysql查询的控制语句图文详解
Apr 11 MySQL
一篇文章弄懂MySQL查询语句的执行过程
May 07 MySQL
MySQL 亿级数据导入导出及迁移笔记
Jun 18 MySQL
浅谈mysql增加索引不生效的几种情况
Jun 23 MySQL
MySQL系列之十四 MySQL的高可用实现
Jul 02 MySQL
mysql 乱码 字符集latin1转UTF8
Apr 19 MySQL
MySQL索引 高效获取数据的数据结构
May 02 MySQL
MySQL详细讲解变量variables的用法
Jun 21 MySQL
MySQL性能指标TPS+QPS+IOPS压测
Aug 05 MySQL
MySQL数据库查询之多表查询总结
Aug 05 MySQL
MySQL 原理与优化之Update 优化
Aug 14 MySQL
MySQL中B树索引和B+树索引的区别详解
MySQL的InnoDB存储引擎的数据页结构详解
一文搞清楚MySQL count(*)、count(1)、count(col)区别
Mar 03 #MySQL
SQL注入篇学习之盲注/宽字节注入
MySQL为数据表建立索引的原则详解
Mar 03 #MySQL
MySQL数据库完全卸载的方法
千万级用户系统SQL调优实战分享
Mar 03 #MySQL
You might like
一个连接两个不同MYSQL数据库的PHP程序
2006/10/09 PHP
MySQL数据库转移,access,sql server 转 MySQL 的图文教程
2007/09/02 PHP
PHP中获取内网用户MAC地址(WINDOWS/linux)的实现代码
2011/08/11 PHP
PHP中“简单工厂模式”实例代码讲解
2012/09/04 PHP
破解.net程序(dll文件)编译和反编译方法
2013/01/31 PHP
基于PHP读取TXT文件向数据库导入海量数据的方法
2013/04/23 PHP
php截取html字符串及自动补全html标签的方法
2015/01/15 PHP
php封装的连接Mysql类及用法分析
2015/12/10 PHP
thinkPHP实现多字段模糊匹配查询的方法
2016/12/01 PHP
PHP中的empty、isset、isnull的区别与使用实例
2019/03/22 PHP
Javascript 跨域访问解决方案
2009/02/14 Javascript
jQuery实现的Email中的收件人效果(按del键删除)
2011/03/20 Javascript
javascript 在firebug调试时用console.log的方法
2012/05/10 Javascript
js比较和逻辑运算符的介绍
2013/03/10 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
nodejs更改项目端口号的方法
2018/05/13 NodeJs
js前端面试之同步与异步问题详解
2019/04/03 Javascript
详解django模板与vue.js冲突问题
2019/07/07 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
[00:50]2014DOTA2国际邀请赛 NEWBEE战队回顾
2014/08/01 DOTA
Python 列表(List)操作方法详解
2014/03/11 Python
Python生成随机密码的方法
2017/06/16 Python
python使用正则表达式替换匹配成功的组并输出替换的次数
2017/11/22 Python
Python基于最小二乘法实现曲线拟合示例
2018/06/14 Python
python实现给scatter设置颜色渐变条colorbar的方法
2018/12/13 Python
基于Python实现人脸自动戴口罩系统
2020/02/06 Python
python 使用xlsxwriter循环向excel中插入数据和图片的操作
2021/01/01 Python
HTML5 Blob 实现文件下载功能的示例代码
2019/11/29 HTML / CSS
世界上获奖最多的手机镜头:Olloclip
2018/03/03 全球购物
运动会跳远加油稿
2014/02/20 职场文书
拒绝黄毒毒宣传标语
2014/06/26 职场文书
观看《周恩来的四个昼夜》思想汇报
2014/09/12 职场文书
失职检讨书大全
2015/01/26 职场文书
2020年元旦祝福语录,总有适合你的
2019/12/31 职场文书
Go标准容器之Ring的使用说明
2021/05/05 Golang
一文解答什么是MySQL的回表
2022/08/05 MySQL