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事务的隔离级别与MVCC
Apr 22 MySQL
mysql数据库入门第一步之创建表
May 14 MySQL
Mysql文件存储图文详解
Jun 01 MySQL
MySQL库表名大小写的选择
Jun 05 MySQL
MySQL GRANT用户授权的实现
Jun 18 MySQL
MySQL如何解决幻读问题
Aug 07 MySQL
SQL基础的查询语句
Nov 11 MySQL
mysql 联合索引生效的条件及索引失效的条件
Nov 20 MySQL
weblogic服务建立数据源连接测试更新mysql驱动包的问题及解决方法
Jan 22 MySQL
MySQL视图概念以及相关应用
Apr 19 MySQL
Mysql开启外网访问
May 15 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
实现了一个PHP5的getter/setter基类的代码
2007/02/25 PHP
php中日期加减法运算实现代码
2011/12/08 PHP
php 多关键字 高亮显示实现代码
2012/04/23 PHP
PHP基本语法实例总结
2016/09/09 PHP
PHP目录与文件操作技巧总结(创建,删除,遍历,读写,修改等)
2016/09/11 PHP
javascript 运算数的求值顺序
2011/08/23 Javascript
JS定时关闭窗口的实例
2013/05/22 Javascript
JQuery的自定义事件代码,触发,绑定简单实例
2013/08/01 Javascript
PHP abstract与interface之间的区别
2013/11/11 Javascript
zepto.js中tap事件阻止冒泡的实现方法
2015/02/12 Javascript
JavaScript中的Math.sin()方法使用详解
2015/06/15 Javascript
AngularJS中如何使用$http对MongoLab数据表进行增删改查
2016/01/23 Javascript
zepto与jquery的区别及zepto的不同使用8条小结
2016/07/28 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
AngularJS日程表案例详解
2017/08/15 Javascript
javascript防抖函数debounce详解
2019/06/11 Javascript
javascript面向对象三大特征之继承实例详解
2019/07/24 Javascript
react 不用插件实现数字滚动的效果示例
2020/04/14 Javascript
ES5 模拟 ES6 的 Symbol 实现私有成员功能示例
2020/05/06 Javascript
Python语言技巧之三元运算符使用介绍
2013/03/04 Python
Python计算字符宽度的方法
2016/06/14 Python
python三引号输出方法
2019/02/27 Python
Python进阶:生成器 懒人版本的迭代器详解
2019/06/29 Python
Python 批量刷博客园访问量脚本过程解析
2019/08/30 Python
python异步编程 使用yield from过程解析
2019/09/25 Python
Django关于admin的使用技巧和知识点
2020/02/10 Python
Python API 操作Hadoop hdfs详解
2020/06/06 Python
求职简历自荐信
2013/10/20 职场文书
自荐书模板
2013/12/15 职场文书
王老吉广告词
2014/03/20 职场文书
写景作文评语集锦
2014/12/25 职场文书
会计专业求职信范文
2015/03/19 职场文书
2015年十一国庆节演讲稿
2015/03/20 职场文书
拾金不昧表扬稿大全
2015/05/05 职场文书
运动会通讯稿50字
2015/07/20 职场文书
2019年健身俱乐部的创业计划书
2019/08/26 职场文书