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 8.0 之不可见列的基本操作
May 20 MySQL
MySQL中VARCHAR与CHAR格式数据的区别
May 26 MySQL
详解MySQL集群搭建
May 26 MySQL
MySQL 那些常见的错误设计规范,你都知道吗
Jul 16 MySQL
SQL优化老出错,那是你没弄明白MySQL解释计划用法
Nov 27 MySQL
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
Feb 12 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
MySQL的存储函数与存储过程的区别解析
Apr 08 MySQL
mysql中如何用命令创建联合唯一索引
Apr 20 MySQL
MySQL 执行数据库更新update操作的时候数据库卡死了
May 02 MySQL
Mysql 一主多从的部署
May 20 MySQL
MySQL下载安装配置详细教程 附下载资源
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
将数组写入txt文件 var_export
2009/04/21 PHP
解析PHP缓存函数的使用说明
2013/05/10 PHP
PHP+AJAX 投票器功能
2017/11/11 PHP
flash 得到自身url参数的代码
2009/11/15 Javascript
JQuery 获取json数据$.getJSON方法的实例代码
2013/08/02 Javascript
window.showModalDialog()返回值的学习心得总结
2014/01/07 Javascript
JavaScript中读取和保存文件实例
2014/05/08 Javascript
JavaScript中的document.referrer在各种浏览器测试结果
2014/07/18 Javascript
JavaScript实现的类字典插入或更新方法实例
2015/07/10 Javascript
AngularJS基础 ng-if 指令用法
2016/08/01 Javascript
vue.js学习之递归组件
2016/12/13 Javascript
socket.io与pm2(cluster)集群搭配的解决方案
2017/06/02 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
小程序自定义日历效果
2018/12/29 Javascript
Vue从TodoList中学父子组件通信
2019/02/05 Javascript
自定义javascript验证框架示例【附源码下载】
2019/05/31 Javascript
vue按需加载实例详解
2019/09/06 Javascript
Vue + Element-ui的下拉框el-select获取额外参数详解
2020/08/14 Javascript
17个Python小技巧分享
2015/01/23 Python
Pyhton中单行和多行注释的使用方法及规范
2016/10/11 Python
33个Python爬虫项目实战(推荐)
2019/07/08 Python
Django logging配置及使用详解
2019/07/23 Python
python如何实现从视频中提取每秒图片
2020/10/22 Python
Python列表操作方法详解
2020/02/09 Python
python中plt.imshow与cv2.imshow显示颜色问题
2020/07/16 Python
简述python&pytorch 随机种子的实现
2020/10/07 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
波兰家具和室内装饰品购物网站:Vivre
2018/04/10 全球购物
采用冷却技术的超自然舒适度:GhostBed床垫
2018/09/18 全球购物
三星俄罗斯授权在线商店:Samsung俄罗斯
2019/09/28 全球购物
一个C/C++编程面试题
2013/11/10 面试题
物业管理员岗位职责范文
2013/11/25 职场文书
五一服装活动方案
2014/01/11 职场文书
办理护照介绍信
2014/01/16 职场文书
洗手间标语
2014/06/23 职场文书