mysql学习之索引介绍及其原理(MySQL学习教程之聚簇索引)
mysql学习之索引介绍及其原理
MySQL学习教程之聚簇索引聚簇,其实是相对于InnoDB这个数据库引擎来说的,因此在将聚簇索引的时候,我们通过InnoDB和MyISAM这两个MySQL的数据库引擎展开。
InnoDB和MyISAM的数据分布对比
|
CREATE TABLE test (col1 int NOT NULL , col2 int NOT NULL , PRIMARY KEY (col1), KEY (col2)); |
首先通过以上SQL语句创建出一个表格,其中col1是主键,两列数据均创建了索引。然后我们数据的主键取值为1-10000,按照随机的顺序插入数据库中。
MyISAM的数据分布
MyISAM的数据存储逻辑比较简单,就是按照数据插入的顺序创建出一个数据表格。直观上来看如下图:
可以看出,数据就是按照插入的顺序“一行一行”生成的。前面还会有一个行号的字段,用处就是在查找到索引的时候能够快速地定位到该行索引的位置。
我们再来看一下具体的细节:
上图展示的情况就是在MyISAM引擎下,按照主键建立的索引的具体实现。可以看出在主键按照顺序排列在叶子结点上的同时,节点中还存储着这个主键在数据库表格中存在的具体的行号,正如我们上面所说的,这个行号可以帮助我们快速地定位到表中数据的位置,也可以把这个行号理解为一个指针,指向了这个主键所在的具体数据行。
那么如果我们按照col2建立索引呢?会有什么不同吗?答案是不会的:
所以得到的结论就是在MyISAM中建立索引是否是主键索引其实是没有区别的,唯一不同的就是这是一个“主键的索引”。
InnoDB的数据分布
因为InnoDB支持聚簇索引,所以会与MyISAM上的索引实现方式有所区别。
我们先看看基于主键的聚簇索引在InnoDB上的实现方式:
首先,和MyISAM上的主键索引一样,这里的索引的叶子结点上同样也是包括了主键的值,并且主键的值是按照顺序排列的。不同的是,每一个叶子结点还包括了事务id,回滚指针和其他非主键列的值(这里指的col2)。所以我们可以理解为InnoDB上的聚簇索引,是将原来表格中的所有的行数据按照主键进行排列然后放在了索引的叶子节点上。这就是一个与MyISAM在主键索引上的一个不同。 MyISAM的主键索引在查找到对应的主键值之后需要通过指针(行号)再去表中找到相对应的数据行,而InnoDB的主键索引,将数据信息全部放在了索引里面,可以直接在索引中查找拿到。
再来看看InnoDB中的二级索引的情况:
可以看到,和InnoDB中的主键索引不同,二级索引并没有在叶子结点存储所有的行数据信息,而是除了索引列的值外,只存储了这个数据行所对应的主键的信息。我们知道在MyISAM中,二级索引和主键索引一样,除了索引列的值外,只存储了一个指针(行号)的信息。
对比一下两个引擎上的二级索引。即存储指针和存储主键值的优劣。
首先存储主键值会比只存储一个指针带来的空间开销更大。但是当我们数据表在进行分裂或者其他改变结构的操作的时候,存储主键值的索引并不会收到影响,而存储指针的索引,可能就要重新进行更新维护。
用一个图对两个引擎中的两种索引进行对比:
总结
到此这篇关于MySQL学习教程之聚簇索引的文章就介绍到这了,更多相关MySQL聚簇索引内容请搜索开心学习网以前的文章或继续浏览下面的相关文章希望大家以后多多支持开心学习网!
原文链接:https://segmentfault.com/a/1190000037713190
- mysql服务器端安装步骤(windows下jsp+mysql网站环境配置方法)
- mysql面试题及答案100题(几个MySQL高频面试题的解答)
- thinkphp5怎么设置默认返回(thinkphp5.1框架实现格式化mysql时间戳为日期的方式小结)
- sysbenchmysql性能跑分(MySQL性能压力基准测试工具sysbench的使用简介)
- 了解mysql数据自动备份(MySQL数据备份方法的选择与思考)
- mysqlbinlog优缺点(MySQL Binlog 日志处理工具对比分析)
- mysql数据库基本使用方法(详解MySQL 数据库范式)
- mysql中修改表的字段名(MySQL 使用SQL语句修改表名的实现)
- mysqlgroupby用法(MySQL Group by的优化详解)
- mysql实验总结分析(MySQL查询截取的深入分析)
- 查看mysql支持的字符集(不可忽视的MySQL字符集)
- mysql锁机制图解(详解mysql 中的锁结构)
- mysql8修改默认端口(MySQL 8.0新特性 — 管理端口的使用简介)
- mysql中查询数据合并(Mysql合并结果接横向拼接字段的实现步骤)
- 宝塔mysql怎么设置优化(宝塔面板mysql内存占用高如何优化)
- mysql密码找回方法(MySQL8忘记密码的快速解决方法)
- 越南新娘(越南新娘骗婚套路流程)
- 菲律宾游学(菲律宾游学中介机构)
- 菲律宾美食(菲律宾美食排行榜前十名)
- 菲律宾特产(菲律宾特产最值得买回国)
- 越南特产(越南特产首饰)
- TVB负评王连续挑战警察角色《使徒行者3》中将饰演卧底(TVB负评王连续挑战警察角色使徒行者3中将饰演卧底)
热门推荐
- HTML5 播放 RTSP 视频的实例代码(HTML5 播放 RTSP 视频的实例代码)
- pythonindex函数用法(python sort、sort_index方法代码实例)
- 阿里云ecs服务器数据在哪儿(阿里云ECS云服务器linux系统安装mysql后远程连接不了踩坑)
- python中统计文本中单词数的代码(Linux上使用Python统计每天的键盘输入次数)
- sql取值唯一的方法(SQL 获取所有上级的实现方法)
- LINQ TO SQL 中join
- docker脚本指定linux(在docker中执行linux shell命令的操作)
- js中的this与with关键字
- php数据库怎么获得表单(php如何把表单内容提交到数据库)
- react怎么绑定state(react纯函数组件setState更新页面不刷新的解决)