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中 unique列插入重复值该怎么解决呢
May 26 MySQL
MySQL里面的子查询的基本使用
Aug 02 MySQL
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
Aug 23 MySQL
mysql 索引合并的使用
Aug 30 MySQL
mysql timestamp比较查询遇到的坑及解决
Nov 27 MySQL
利用JuiceFS使MySQL 备份验证性能提升 10 倍
Mar 17 MySQL
MySQL 外连接语法之 OUTER JOIN
Apr 09 MySQL
以MySQL5.7为例了解一下执行计划
Apr 13 MySQL
使用Mysql计算地址的经纬度距离和实时位置信息
Apr 29 MySQL
MySql数据库 查询时间序列间隔
May 11 MySQL
MySQL 原理与优化之Limit 查询优化
Aug 14 MySQL
DQL数据查询语句使用示例
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
PHP实现读取一个1G的文件大小
2013/08/24 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
阿里云Win2016安装Apache和PHP环境图文教程
2018/03/11 PHP
firefox下jquery iframe刷新页面提示会导致重复之前动作
2012/12/17 Javascript
使用js实现雪花飘落效果
2013/08/26 Javascript
原生js编写autoComplete插件
2016/04/13 Javascript
jQuery调用Webservice传递json数组的方法
2016/08/06 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
tangram.js库实现js类的方式实例分析
2018/01/06 Javascript
React Router V4使用指南(精讲)
2018/09/17 Javascript
vue动态子组件的两种实现方式
2019/09/01 Javascript
vue-autoui自匹配webapi的UI控件的实现
2020/03/20 Javascript
vue iview实现动态新增和删除
2020/06/17 Javascript
javascript实现打砖块小游戏(附完整源码)
2020/09/18 Javascript
vue3.0封装轮播图组件的步骤
2021/03/04 Vue.js
Python爬虫实现网页信息抓取功能示例【URL与正则模块】
2017/05/18 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
Python中list循环遍历删除数据的正确方法
2019/09/02 Python
python BlockingScheduler定时任务及其他方式的实现
2019/09/19 Python
python使用gdal对shp读取,新建和更新的实例
2020/03/10 Python
python 解决mysql where in 对列表(list,,array)问题
2020/06/06 Python
python+flask编写一个简单的登录接口
2020/11/13 Python
使用css3匹配手机屏幕横竖状态
2014/01/27 HTML / CSS
CSS3 旋转立方体问题详解
2020/01/09 HTML / CSS
html5唤醒APP小记
2019/03/27 HTML / CSS
size?爱尔兰官方网站:英国伦敦的球鞋精品店
2019/03/31 全球购物
Speedo速比涛法国官方网站:泳衣、泳镜、泳帽、泳裤
2019/07/30 全球购物
德国家用电器购物网站:Premiumshop24
2019/08/22 全球购物
Europcar比利时:租车
2019/08/26 全球购物
世界上最受欢迎的花店:1-800-Flowers.com
2020/06/01 全球购物
在什么时候需要使用"常引用"
2015/12/31 面试题
类和结构的区别
2012/08/15 面试题
计算机专业学生的自我评价
2013/12/15 职场文书
高中班主任评语
2014/12/30 职场文书
捐书活动倡议书
2015/04/27 职场文书
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL