MySQL之MyIsam索引
文章目录
- MySQL之MyIsam索引
- 1.MyIsam索引介绍
- 2.演示(单列主键索引、等值查询、范围查询)
MySQL之MyIsam索引
1.MyIsam索引介绍
MyISAM的数据文件和索引文件是分开存储的。MyISAM使用B+树构建索引树时,叶子节点中存储的键值为索引列的值,数据为索引所在行的磁盘地址。
在 MyISAM 中,辅助索引和主键索引的结构是一样的,没有任何区别,叶子节点的数据存储的都是行记录的磁盘地址。只是主键索引的键值是唯一的,而辅助索引的键值可以重复。查询数据时,由于辅助索引的键值不唯一,可能存在多个拥有相同的记录,所以即使是等值查询,也需要按照范围查询的方式在辅助索引树中检索数据。myisam 通过 key_buffer 把索引先缓存到内存中,当需要访问数据时(通过索引访问数据),在内存中直接搜索索引,然后通过索引找到磁盘相应数据,这也就是为什么索引不在 key buffer 命中时,速度慢的原因
注意:MyISAM无论主键索引还是二级索引都是非聚簇索引,而InnoDB的主键索引是聚簇索引,二级索引是非聚簇索引。
2.演示(单列主键索引、等值查询、范围查询)
以一个简单的user表为例。user表存在两个索引,id列为主键索引,age列为普通索引;
表user的索引存储在索引文件user.MYI中,数据文件存储在数据文件 user.MYD中。
CREATE TABLE `user`
(`id` int(11) NOT NULL AUTO_INCREMENT,`username` varchar(20) DEFAULT NULL,`age` int(11) DEFAULT NULL,PRIMARY KEY (`id`) USING BTREE,KEY `idx_age` (`age`) USING BTREE
) ENGINE = MyISAMAUTO_INCREMENT = 1DEFAULT CHARSET = utf8;
主键索引:
根据主键等值查询数据:
先在主键树中从根节点开始检索,将根节点加载到内存,比较28<75,走左路。(1次磁盘IO)
将左子树节点加载到内存中,比较16<28<47,向下检索。(1次磁盘IO)
检索到叶节点,将节点加载到内存中遍历,比较16<28,18<28,28=28。查找到值等于30的索引项。(1次磁盘IO)
从索引项中获取磁盘地址,然后到数据文件user.MYD中获取对应整行记录。(1次磁盘IO)
将记录返给客户端。
磁盘IO次数:3次索引检索+记录数据检索
select * from user where id = 28;
根据主键范围查询数据:
先在主键树中从根节点开始检索,将根节点加载到内存,比较28<75,走左路。(1次磁盘IO)
将左子树节点加载到内存中,比较16<28<47,向下检索。(1次磁盘IO)
检索到叶节点,将节点加载到内存中遍历比较16<28,18<28,28=28<47。查找到值等于28的索引项。
根据磁盘地址从数据文件中获取行记录缓存到结果集中。(1次磁盘IO)
我们的查询语句时范围查找,需要向后遍历底层叶子链表,直至到达最后一个不满足筛选条件。
向后遍历底层叶子链表,将下一个节点加载到内存中,遍历比较,28<47=47,根据磁盘地址从数据文件中获取行记录缓存到结果集中。(1次磁盘IO)
最后得到两条符合筛选条件,将查询结果集返给客户端。
磁盘IO次数:4次索引检索+记录数据检索。
注:备注:以上分析仅供参考,MyISAM在查询时,会将索引节点缓存在MySQL缓存中,而数据缓存依赖于操作系统自身的缓存,所以并不是每次都是走的磁盘,这里只是为了分析索引的使用过程
select * from user where id between 28 and 47;
MySQL之MyIsam索引相关推荐
- MySQL中myisam和innodb的主键索引有什么区别?
MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索 ...
- 【MySQl】MyISAM和InnoDB索引对比
[MySQl]MyISAM和InnoDB索引对比 部分内容转自:http://www.2cto.com/database/201211/172380.html 比较好的文章:http://www.cn ...
- mysql教程联合索引_MySQL中的联合索引学习教程
联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| ...
- mysql实习生笔试题_2014阿里实习生面试题MySQL如何实现索引的
[相关专题推荐:mysql面试题(2020)] 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,比如MyISAM和InnoDB存储引擎. MyISAM索引实现: My ...
- mysql的覆盖索引原理_「Mysql索引原理(七)」覆盖索引
通常大家都会根据查询的WHERE条件来创建合适的索引,不过这只是索引优化的一个方面.设计优秀的索引应该考虑到整个查询,而不单单是WHERE条件部分.索引确实是一种查找数据的高效方式,但是MySQL也可 ...
- MySQL中MyISAM 与innoDB的区别(转)
InnoDB 和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而 InnoDB类型支持.MyISAM类型的表强调 ...
- MySQL重温笔记-索引
mysql分客户端.服务层.存储引擎层,而索引的实现就是在存储引擎层,因此各个不同的存储引擎之间的索引都有细微的差别. [B-Tree索引] MyIsam使用前缀压缩技术使得索引更小,Innodb则按 ...
- mysql 多列索引的生效规则
mysql中 myisam,innodb默认使用的是 Btree索引,至于btree的数据结构是怎样的都不重要, 只需要知道结果,既然是索引那这个数据结构最后是排好序:就像新华字典他的目录就是按照a, ...
- mysql5.6 函数索引_聊聊MySQL中的索引
关于MySQL中的索引使用 索引是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的SQL性能问题. 索引的存储分类: 1.B-Tree索引:最常见的索引类型,大部分引擎都支 ...
最新文章
- 商汤科技 中科院自动化所:视觉跟踪之端到端的光流相关滤波 | CVPR 2018
- 大数据 notebook_Dockerless Notebook:数据科学期待已久的未来
- python spark dataframe_pyspark dataframe 常用操作
- Ubuntu16.04下配置laravel
- 众专家推荐《移动微技(Mobile Widget)应用开发权威指南》
- Atitit 外出活动实名制条例sak令[2018]第920号 《外出活动实名制管理条例》 SAK安全部令 第920号 现发布《外出活动实名制管理条例》,自2018年9月1日起施行。
- Hive调优全方位指南(推荐收藏)
- 智通标书制作系统 5.1
- python调用迅雷下载引擎_GitHub - cryzlasm/ThunderOpenSDK: 迅雷开放下载引擎, 收集, 使用...
- python图片马赛克_利用Python对图片进行马赛克处理
- firefox无法显示flash问题解决
- 根据王小云教授的算法写的MD5碰撞的程序[c源代码]
- 拼多多分类ID搜索商品数据分析接口(商品列表数据,商品销量数据,商品详情数据)代码对接教程
- ug安装lmtools显示未连接服务器,服务器(LMTOOLS)设置教程
- 布局文件之间含有相同的id的控件
- Ps/2遇到KVM,这时候有一种情况需要注意
- 新华三的背景_新华三的背景_开放融合创新:新华三全力支撑运营商5G赋能百业...
- AutoGluon-教程1-简单的入门模型
- 三种方法助力绝地求生:刺激战场和绝地求生:全军出击快速上分吃鸡
- 西密歇根大学计算机科学专业排名,西密歇根大学计算机科学专业硕士申请条件及案例分享...
热门文章
- 【狐记】一心如旧(剑网3·侠肝义胆沈剑心 第二季ED)
- C语言: 求N分之一序列前N项和.2021-07-13
- CSS之linear-gradiend ——实现条纹背景效果
- 写作助手-合并md文件-1607419541922,一线大厂架构师都推荐的Android零基础大全
- 当今海外有多少国名“拜中国所赐”?
- JavaScript运算符的优先级
- matmul torch 详解_[pytorch] 通过一个例子分析torch.matmul矩阵与向量相乘的维度
- Openlayers加载离线地图Arcgis瓦片
- cesium加载离线tms切片
- RHEL9.0 安全启动提示Verification failed: (0x1A) Secureity Violation解决方法