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 22 MySQL
Mysql数据库命令大全
May 26 MySQL
正确使用MySQL INSERT INTO语句
May 26 MySQL
Mysql实现主从配置和多主多从配置
Jun 02 MySQL
解决Mysql的left join无效及使用的注意事项说明
Jul 01 MySQL
MySQL系列之十一 日志记录
Jul 02 MySQL
SQL实现LeetCode(177.第N高薪水)
Aug 04 MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 MySQL
MySQL之MyISAM存储引擎的非聚簇索引详解
Mar 03 MySQL
MySQL创建管理LIST分区
Apr 13 MySQL
mysql中关键词exists的用法实例详解
Jun 10 MySQL
MySQL事务的ACID特性以及并发问题方案
Jul 15 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 UBB 解析实现代码
2011/11/27 PHP
PHP 杂谈《重构-改善既有代码的设计》之四 简化条件表达式
2012/04/09 PHP
简单介绍win7下搭建apache+php+mysql开发环境
2015/08/06 PHP
php 输出json及显示json中的中文汉字详解及实例
2016/11/09 PHP
Zend Framework数据库操作技巧总结
2017/02/18 PHP
Laravel获取所有的数据库表及结构的方法
2019/10/10 PHP
PHP7 参数处理机制修改
2021/03/09 PHP
img标签中onerror用法
2009/08/13 Javascript
JQuery SELECT单选模拟jQuery.select.js
2009/11/12 Javascript
分享精心挑选的23款美轮美奂的jQuery 图片特效插件
2012/08/14 Javascript
页面只能打开一次Cooike如何实现
2012/12/04 Javascript
JavaScript中“过于”犀利地for/in循环使用示例
2013/10/22 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
thinkphp 表名 大小写 窍门
2015/02/01 Javascript
JavaScript整除运算函数ceil和floor的区别分析
2015/04/14 Javascript
JavaScript的RequireJS库入门指南
2015/07/01 Javascript
jquery实现可横向和竖向展开的动态下滑菜单效果
2015/08/24 Javascript
jQuery 检查某个元素在页面上是否存在实例代码
2016/10/27 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
详解AngularJS controller调用factory
2017/05/19 Javascript
vue双向数据绑定知识点总结
2018/04/18 Javascript
js隐式转换的知识实例讲解
2018/09/28 Javascript
实现vuex与组件data之间的数据同步更新方式
2019/11/12 Javascript
echarts.js 动态生成多个图表 使用vue封装组件操作
2020/07/19 Javascript
详解Python开发中如何使用Hook技巧
2017/11/01 Python
Python3.6安装及引入Requests库的实现方法
2018/01/24 Python
pycharm配置当鼠标悬停时快速提示方法参数
2019/07/31 Python
Python+OpenCV图像处理——打印图片属性、设置存储路径、调用摄像头
2020/10/22 Python
CSS3线性渐变简单实现以及该属性在浏览器中的不同
2012/12/12 HTML / CSS
html5图片上传预览示例分享
2014/04/14 HTML / CSS
HTML5手指下滑弹出负一屏阻止移动端浏览器内置下拉刷新功能的实现代码
2020/04/10 HTML / CSS
英国健身仓库:Bodybuilding Warehouse
2019/03/06 全球购物
什么是makefile? 如何编写makefile?
2013/01/02 面试题
特色蛋糕店创业计划书
2014/01/28 职场文书
优秀团员自我评价
2015/03/10 职场文书
2016年敬老月活动总结
2016/04/05 职场文书