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时间设置注意事项的深入总结
May 06 MySQL
mysql5.7使用binlog 恢复数据的方法
Jun 03 MySQL
MYSQL 无法识别中文的永久解决方法
Jun 03 MySQL
浅谈mysql返回Boolean类型的几种情况
Jun 04 MySQL
MySql子查询IN的执行和优化的实现
Aug 02 MySQL
MYSQL 运算符总结
Nov 11 MySQL
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
Feb 12 MySQL
Mysql Innodb存储引擎之索引与算法
Feb 15 MySQL
MySQL 分区表中分区键为什么必须是主键的一部分
Mar 17 MySQL
mysql的单列多值存储实例详解
Apr 05 MySQL
MySQL去除密码登录告警的方法
Apr 20 MySQL
MySQL安装失败的原因及解决步骤
Jun 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
真正的ZIP文件操作类(php)
2007/07/21 PHP
PHP DataGrid 实现代码
2009/08/12 PHP
探讨Hessian在PHP中的使用分析
2013/06/13 PHP
PHP中配置IIS7实现基本身份验证的方法
2015/09/24 PHP
PHP检查端口是否可以被绑定的方法示例
2018/08/09 PHP
Javascript获取HTML静态页面参数传递值示例
2013/08/18 Javascript
jquery 扑捉回车键事件代码
2014/04/24 Javascript
JQuery中extend的用法实例分析
2015/02/08 Javascript
jquery实现的淡入淡出下拉菜单效果
2015/08/25 Javascript
jQuery+CSS3+Html5实现弹出层效果实例代码(附源码下载)
2016/05/16 Javascript
Javascript中级语法快速入手
2016/07/30 Javascript
初识简单却不失优雅的Vue.js
2016/09/12 Javascript
Node.js如何使用Diffie-Hellman密钥交换算法详解
2017/09/05 Javascript
解决linux下node.js全局模块找不到的问题
2018/05/15 Javascript
js如何找出字符串中的最长回文串
2018/06/04 Javascript
JavaScript常用事件介绍
2019/01/21 Javascript
如何测量vue应用运行时的性能
2019/06/21 Javascript
关于Js中new操作符的作用详解
2021/02/21 Javascript
python算法学习之桶排序算法实例(分块排序)
2013/12/18 Python
Python基于identicon库创建类似Github上用的头像功能
2017/09/25 Python
通过python+selenium3实现浏览器刷简书文章阅读量
2017/12/26 Python
对Python中gensim库word2vec的使用详解
2018/05/08 Python
Python 实现数据结构中的的栈队列
2019/05/16 Python
python GUI库图形界面开发之PyQt5简单绘图板实例与代码分析
2020/03/08 Python
Python Matplotlib绘图基础知识代码解析
2020/08/31 Python
公司联欢晚会主持词
2014/03/22 职场文书
高三毕业典礼主持词
2014/03/27 职场文书
工程负责人任命书
2014/06/06 职场文书
安全资料员岗位职责范本
2014/06/28 职场文书
人事经理岗位职责范本
2014/08/04 职场文书
大学生在校表现评语
2014/12/31 职场文书
行为习惯主题班会
2015/08/14 职场文书
大学三好学生主要事迹范文
2015/11/03 职场文书
导游词之无锡东林书院
2019/12/11 职场文书
深入浅析React中diff算法
2021/05/19 Javascript
sqlserver连接错误之SQL评估期已过的问题解决
2022/03/23 SQL Server