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 22 MySQL
MySQL查询学习之基础查询操作
May 08 MySQL
修改MySQL的数据库引擎为INNODB的方法
May 26 MySQL
解决Navicat for Mysql连接报错1251的问题(连接失败)
May 27 MySQL
MYSQL 的10大经典优化案例场景实战
Sep 14 MySQL
MySQL和Oracle批量插入SQL的通用写法示例
Nov 17 MySQL
浅谈mysql哪些情况会导致索引失效
Nov 20 MySQL
mysql聚集索引、辅助索引、覆盖索引、联合索引的使用
Feb 12 MySQL
mysql中数据库覆盖导入的几种方式总结
Mar 25 MySQL
你真的会用Mysql的explain吗
Mar 31 MySQL
MySQL添加索引特点及优化问题
Jul 23 MySQL
MySQL 原理优化之Group By的优化技巧
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
推荐几部必看的DC动画电影
2020/03/03 欧美动漫
PHP 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
php + ajax 实现的写入数据库操作简单示例
2020/05/16 PHP
jsp js鼠标移动到指定区域显示选项卡离开时隐藏示例
2013/06/14 Javascript
Javascript 实现复制(Copy)动作方法大全
2014/06/20 Javascript
JS组件Bootstrap实现图片轮播效果
2016/05/16 Javascript
jQuery插件form-validation-engine正则表达式操作示例
2017/02/09 Javascript
jQuery源码分析之init的详细介绍
2017/02/13 Javascript
Angular中支持SCSS的方法
2017/11/18 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
2018/08/13 Javascript
vue升级之路之vue-router的使用教程
2018/08/14 Javascript
用npm安装vue和vue-cli,并使用webpack创建项目的方法
2018/09/28 Javascript
细述Javascript的加法运算符的具体使用
2019/10/18 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
JS中队列和双端队列实现及应用详解
2020/09/29 Javascript
解决iview table组件里的 固定列 表格不自适应的问题
2020/11/13 Javascript
[05:04]DOTA2上海特级锦标赛主赛事第二日TOP10
2016/03/04 DOTA
[01:03:13]VG vs Pain 2018国际邀请赛小组赛BO2 第一场 8.18
2018/08/19 DOTA
教你安装python Django(图文)
2013/11/04 Python
Python md5与sha1加密算法用法分析
2017/07/14 Python
简单了解python单例模式的几种写法
2019/07/01 Python
Pycharm新建模板默认添加个人信息的实例
2019/07/15 Python
Django如何简单快速实现PUT、DELETE方法
2019/07/24 Python
Python 中判断列表是否为空的方法
2019/11/24 Python
python实现将json多行数据传入到mysql中使用
2019/12/31 Python
使用python客户端访问impala的操作方式
2020/03/28 Python
Django用户身份验证完成示例代码
2020/04/03 Python
python nohup 实现远程运行不宕机操作
2020/04/16 Python
HTML5语义化元素你真的用对了吗
2019/08/22 HTML / CSS
研究生自我鉴定范文
2013/10/30 职场文书
物业电工岗位职责
2013/11/20 职场文书
中学生操行评语大全
2014/04/24 职场文书
村党建工作汇报材料
2014/11/02 职场文书
2014幼儿园小班工作总结
2014/11/10 职场文书
Mysql服务添加 iptables防火墙策略的方案
2021/04/29 MySQL