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 使用SQL语句修改表名的实现
Apr 07 MySQL
如何搭建 MySQL 高可用高性能集群
Jun 21 MySQL
MySQL 聚合函数排序
Jul 16 MySQL
Mysql案例刨析事务隔离级别
Sep 25 MySQL
MySQL对数据表已有表进行分区表的实现
Nov 01 MySQL
MySQL中rank() over、dense_rank() over、row_number() over用法介绍
Mar 23 MySQL
MySQL学习必备条件查询数据
Mar 25 MySQL
mysql的Buffer Pool存储及原理
Apr 02 MySQL
一文简单了解MySQL前缀索引
Apr 03 MySQL
Golang连接并操作MySQL
Apr 14 MySQL
Mysql查询时间区间日期列表,不会由于数据表数据影响
Apr 19 MySQL
MySQL一劳永逸永久支持输入中文的方法实例
Aug 05 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
php+MySQL判断update语句是否执行成功的方法
2014/08/28 PHP
自动更新作用
2006/10/08 Javascript
用jquery与css打造个性化的单选框和复选框
2010/10/20 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
jQuery DOM删除节点操作指南
2015/03/03 Javascript
对Web开发中前端框架与前端类库的一些思考
2015/03/27 Javascript
jQuery实现可编辑的表格实例讲解(2)
2015/09/17 Javascript
使用Node.js处理前端代码文件的编码问题
2016/02/16 Javascript
【经验总结】编写JavaScript代码时应遵循的14条规律
2016/06/20 Javascript
js中scrollTop()方法和scroll()方法用法示例
2016/10/03 Javascript
在javaScript中检测数据类型的几种方式小结
2017/03/04 Javascript
js简易版购物车功能
2017/06/17 Javascript
Node.js如何实现注册邮箱激活功能 (常见)
2017/07/23 Javascript
利用adb shell和node.js实现抖音自动抢红包功能(推荐)
2018/02/22 Javascript
Angular5中调用第三方js插件的方法
2018/02/26 Javascript
微信小程序实现炫酷的弹出式菜单特效
2019/01/28 Javascript
vue使用混入定义全局变量、函数、筛选器的实例代码
2019/07/29 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
2款Python内存检测工具介绍和使用方法
2014/06/01 Python
在windows下快速搭建web.py开发框架方法
2016/04/22 Python
python 中的divmod数字处理函数浅析
2017/10/17 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
TENSORFLOW变量作用域(VARIABLE SCOPE)
2020/01/10 Python
Python单元测试模块doctest的具体使用
2020/02/10 Python
python解析xml文件方式(解析、更新、写入)
2020/03/05 Python
python代码能做成软件吗
2020/07/24 Python
python 发送邮件的示例代码(Python2/3都可以直接使用)
2020/12/03 Python
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
公务员保密承诺书
2014/03/27 职场文书
培训讲师岗位职责
2014/04/13 职场文书
微笑服务标语
2014/06/24 职场文书
回复函格式及范文
2015/07/14 职场文书
初中数学教学反思范文
2016/02/17 职场文书
中学生打架《检讨书》范文
2019/08/12 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js
Oracle 11g数据库使用expdp每周进行数据备份并上传到备份服务器
2022/06/28 Oracle