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 08 MySQL
MySQL 数据丢失排查案例
May 08 MySQL
MySQL官方导出工具mysqlpump的使用
May 21 MySQL
MySql开发之自动同步表结构
May 28 MySQL
MySQL 那些常见的错误设计规范,你都知道吗
Jul 16 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
面试提问mysql一张表到底能存多少数据
Mar 13 MySQL
mysql insert 存在即不插入语法说明
Mar 25 MySQL
Golang连接并操作MySQL
Apr 14 MySQL
MySQL使用IF语句及用case语句对条件并结果进行判断 
Sep 23 MySQL
mysql通过group by分组取最大时间对应数据的两种有效方法
Sep 23 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把session写入数据库示例
2014/02/26 PHP
Laravel 5框架学习之环境与配置
2015/04/08 PHP
PHP实现多维数组转字符串和多维数组转一维数组的方法
2015/08/08 PHP
php实现图片缩略图的方法
2016/03/29 PHP
php实现websocket实时消息推送
2018/03/30 PHP
jQuery代码优化 遍历篇
2011/11/01 Javascript
JS实现随机化快速排序的实例代码
2013/08/01 Javascript
jQuery动态添加、删除元素的方法
2014/01/09 Javascript
鼠标经过tr时,改变tr当前背景颜色
2014/01/13 Javascript
jquery mobile动态添加元素之后不能正确渲染解决方法说明
2014/03/05 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
jQuery往textarea中光标所在位置插入文本的方法
2015/06/26 Javascript
JS添加或修改控件的样式(Class)实现方法
2016/10/15 Javascript
微信小程序 教程之wxapp视图容器 swiper
2016/10/19 Javascript
Angular2 PrimeNG分页模块学习
2017/01/14 Javascript
vue todo-list组件发布到npm上的方法
2018/04/04 Javascript
Vuex模块化应用实践示例
2020/02/03 Javascript
python学习教程之Numpy和Pandas的使用
2017/09/11 Python
python TCP Socket的粘包和分包的处理详解
2018/02/09 Python
pandas值替换方法
2018/07/10 Python
python读取txt文件中特定位置字符的方法
2018/12/24 Python
Python图像的增强处理操作示例【基于ImageEnhance类】
2019/01/03 Python
python GUI图形化编程wxpython的使用
2019/07/19 Python
django中嵌套的try-except实例
2020/05/21 Python
python将字典内容写入json文件的实例代码
2020/08/12 Python
python Matplotlib模块的使用
2020/09/16 Python
HTML5+CSS3实现机器猫
2016/10/17 HTML / CSS
英国受欢迎的运动鞋和街头服装商店:Footasylum
2018/06/12 全球购物
电脑教师的教学自我评价
2013/11/26 职场文书
小学三年级数学教学反思
2014/01/31 职场文书
爱国主义教育演讲稿
2014/08/26 职场文书
共产党员批评与自我批评
2014/10/15 职场文书
给老婆的检讨书
2015/01/27 职场文书
保护地球的宣传语
2015/07/13 职场文书
关于开学的感想
2015/08/10 职场文书
《卖火柴的小女孩》教学反思
2016/02/19 职场文书