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 05 MySQL
详解Mysql和Oracle之间的误区
May 18 MySQL
mysql联合索引的使用规则
Jun 23 MySQL
MySQL系列之六 用户与授权
Jul 02 MySQL
MySQL Shell import_table数据导入的实现
Aug 07 MySQL
MySQL定时备份数据库(全库备份)的实现
Sep 25 MySQL
MySQL数据库中varchar类型的数字比较大小的方法
Nov 17 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
Jan 22 MySQL
Mysql如何实现不存在则插入,存在则更新
Mar 25 MySQL
MySQ InnoDB和MyISAM存储引擎介绍
Apr 26 MySQL
SQLServer常见数学函数梳理总结
Aug 05 MySQL
Mysql如何查看是否使用到索引
Dec 24 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
第1次亲密接触PHP5(1)
2006/10/09 PHP
2017年最好用的9个php开发工具推荐(超好用)
2017/10/23 PHP
php探针使用原理和技巧讲解
2019/09/17 PHP
动态加载script文件的两种方法
2013/08/15 Javascript
如何实现chrome浏览器关闭页面时弹出“确定要离开此面吗?”
2015/03/05 Javascript
js实现类似jquery里animate动画效果的方法
2015/04/10 Javascript
理解 JavaScript Scoping & Hoisting(二)
2015/11/18 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
2016/03/03 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
2016/07/04 Javascript
简单实现jquery焦点图
2016/12/12 Javascript
AngularJS中下拉框的基本用法示例
2017/10/11 Javascript
Vue 中使用 CSS Modules优雅方法
2018/04/09 Javascript
详解JavaScript函数callee、call、apply的区别
2019/03/08 Javascript
了解javascript中的Dom操作
2019/05/27 Javascript
使用jquery-easyui的布局layout写后台管理页面的代码详解
2019/06/19 jQuery
Vue中消息横向滚动时setInterval清不掉的问题及解决方法
2019/08/23 Javascript
vue-cli 为项目设置别名的方法
2019/10/15 Javascript
详解javascript中var与ES6规范中let、const区别与用法
2020/01/11 Javascript
解决echarts中横坐标值显示不全(自动隐藏)问题
2020/07/20 Javascript
python访问纯真IP数据库的代码
2011/05/19 Python
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
玩转python爬虫之爬取糗事百科段子
2016/02/17 Python
Python实现简易Web爬虫详解
2018/01/03 Python
Python在groupby分组后提取指定位置记录方法
2018/04/20 Python
在Qt5和PyQt5中设置支持高分辨率屏幕自适应的方法
2019/06/18 Python
LN-CC美国:伦敦时尚生活的缩影
2019/02/19 全球购物
师范毕业生自荐信
2013/10/17 职场文书
测控技术与通信工程毕业生自荐信范文
2013/12/28 职场文书
五年级数学教学反思
2014/02/11 职场文书
先进事迹演讲稿
2014/09/01 职场文书
房屋维修协议书范本
2014/09/25 职场文书
违反单位工作制度检讨书
2014/10/25 职场文书
2014年学校食堂工作总结
2014/11/25 职场文书
2015年教师自我评价范文
2015/03/04 职场文书
就业推荐表院系意见
2015/06/05 职场文书
redis三种高可用方式部署的实现
2021/05/11 Redis