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 相关文章推荐
如何使用Maxwell实时同步mysql数据
Apr 08 MySQL
MySQL root密码的重置方法
Apr 21 MySQL
MySQL中InnoDB存储引擎的锁的基本使用教程
May 26 MySQL
Mysql 设置boolean类型的操作
Jun 04 MySQL
解析MySQL binlog
Jun 11 MySQL
详细聊聊关于Mysql联合查询的那些事儿
Oct 24 MySQL
Mysql忘记密码解决方法
Feb 12 MySQL
Mysql调整优化之四种分区方式以及组合分区
Apr 13 MySQL
详细介绍MySQL中limit和offset的用法
May 06 MySQL
MySQL 计算连续登录天数
May 11 MySQL
mysql实现将字符串字段转为数字排序或比大小
Jun 14 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
PHP 开发环境配置(Zend Studio)
2010/04/28 PHP
PHP中怎样保持SESSION不过期 原理及方案介绍
2013/08/08 PHP
php实现粘贴截图并完成上传功能
2015/05/17 PHP
Laravel+jQuery实现AJAX分页效果
2016/09/14 PHP
thinkPHP模板中函数的使用方法示例
2016/11/30 PHP
PHP+AjaxForm异步带进度条上传文件实例代码
2017/08/14 PHP
在laravel框架中实现封装公共方法全局调用
2019/10/14 PHP
用javascript实现分割提取页面所需内容
2007/05/09 Javascript
javascript 简练的几个函数
2009/08/29 Javascript
新浪微博字数统计 textarea字数统计实现代码
2011/08/28 Javascript
suggestion开发小结以及对键盘事件的总结(针对中文输入法状态)
2011/12/20 Javascript
原生JS绑定滑轮滚动事件兼容常见浏览器
2014/06/30 Javascript
javascript实现密码验证
2015/11/10 Javascript
Javascript 制作图形验证码实例详解
2016/12/22 Javascript
nodejs基于WS模块实现WebSocket聊天功能的方法
2018/01/12 NodeJs
JS实现的自定义map方法示例
2019/05/17 Javascript
Python输出带颜色的字符串实例
2017/10/10 Python
如何使用 Pylint 来规范 Python 代码风格(来自IBM)
2018/04/06 Python
python3连接MySQL数据库实例详解
2018/05/24 Python
Python实现的建造者模式示例
2018/08/06 Python
解决安装python库时windows error5 报错的问题
2018/10/21 Python
对Python+opencv将图片生成视频的实例详解
2019/01/08 Python
详解用python自制微信机器人,定时发送天气预报
2019/03/25 Python
Django使用模板后无法找到静态资源文件问题解决
2019/07/19 Python
django基于restframework的CBV封装详解
2019/08/08 Python
Python字符串的修改方法实例
2019/12/19 Python
TensorFlow2.0使用keras训练模型的实现
2021/02/20 Python
CSS3 实现童年的纸飞机
2019/05/05 HTML / CSS
英国护肤品购物网站:Beauty Expert
2016/08/19 全球购物
ProBikeKit澳大利亚:自行车套件,跑步和铁人三项装备
2016/11/30 全球购物
美国网上鞋子零售商:Dr. Scholl’s Shoes
2017/11/17 全球购物
Spartoo美国:欧洲排名第一的在线时装零售商
2019/12/12 全球购物
车间核算员岗位职责
2014/07/01 职场文书
经典搞笑版检讨书
2015/02/19 职场文书
植树节新闻稿
2015/07/17 职场文书
MySQL中InnoDB存储引擎的锁的基本使用教程
2021/05/26 MySQL