文章目录

  • 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索引相关推荐

  1. MySQL中myisam和innodb的主键索引有什么区别?

    MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索 ...

  2. 【MySQl】MyISAM和InnoDB索引对比

    [MySQl]MyISAM和InnoDB索引对比 部分内容转自:http://www.2cto.com/database/201211/172380.html 比较好的文章:http://www.cn ...

  3. mysql教程联合索引_MySQL中的联合索引学习教程

    联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). 可以支持a | a,b| ...

  4. mysql实习生笔试题_2014阿里实习生面试题MySQL如何实现索引的

    [相关专题推荐:mysql面试题(2020)] 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,比如MyISAM和InnoDB存储引擎. MyISAM索引实现: My ...

  5. mysql的覆盖索引原理_「Mysql索引原理(七)」覆盖索引

    通常大家都会根据查询的WHERE条件来创建合适的索引,不过这只是索引优化的一个方面.设计优秀的索引应该考虑到整个查询,而不单单是WHERE条件部分.索引确实是一种查找数据的高效方式,但是MySQL也可 ...

  6. MySQL中MyISAM 与innoDB的区别(转)

    InnoDB 和MyISAM是在使用MySQL最常用的两个表类型,各有优缺点,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而 InnoDB类型支持.MyISAM类型的表强调 ...

  7. MySQL重温笔记-索引

    mysql分客户端.服务层.存储引擎层,而索引的实现就是在存储引擎层,因此各个不同的存储引擎之间的索引都有细微的差别. [B-Tree索引] MyIsam使用前缀压缩技术使得索引更小,Innodb则按 ...

  8. mysql 多列索引的生效规则

    mysql中 myisam,innodb默认使用的是 Btree索引,至于btree的数据结构是怎样的都不重要, 只需要知道结果,既然是索引那这个数据结构最后是排好序:就像新华字典他的目录就是按照a, ...

  9. mysql5.6 函数索引_聊聊MySQL中的索引

    关于MySQL中的索引使用 索引是数据库优化中最常用也是最重要的手段之一,通过索引通常可以帮助用户解决大多数的SQL性能问题. 索引的存储分类: 1.B-Tree索引:最常见的索引类型,大部分引擎都支 ...

最新文章

  1. 商汤科技 中科院自动化所:视觉跟踪之端到端的光流相关滤波 | CVPR 2018
  2. 大数据 notebook_Dockerless Notebook:数据科学期待已久的未来
  3. python spark dataframe_pyspark dataframe 常用操作
  4. Ubuntu16.04下配置laravel
  5. 众专家推荐《移动微技(Mobile Widget)应用开发权威指南》
  6. Atitit 外出活动实名制条例sak令[2018]第920号 《外出活动实名制管理条例》     SAK安全部令 第920号 现发布《外出活动实名制管理条例》,自2018年9月1日起施行。
  7. Hive调优全方位指南(推荐收藏)
  8. 智通标书制作系统 5.1
  9. python调用迅雷下载引擎_GitHub - cryzlasm/ThunderOpenSDK: 迅雷开放下载引擎, 收集, 使用...
  10. python图片马赛克_利用Python对图片进行马赛克处理
  11. firefox无法显示flash问题解决
  12. 根据王小云教授的算法写的MD5碰撞的程序[c源代码]
  13. 拼多多分类ID搜索商品数据分析接口(商品列表数据,商品销量数据,商品详情数据)代码对接教程
  14. ug安装lmtools显示未连接服务器,服务器(LMTOOLS)设置教程
  15. 布局文件之间含有相同的id的控件
  16. Ps/2遇到KVM,这时候有一种情况需要注意
  17. 新华三的背景_新华三的背景_开放融合创新:新华三全力支撑运营商5G赋能百业...
  18. AutoGluon-教程1-简单的入门模型
  19. 三种方法助力绝地求生:刺激战场和绝地求生:全军出击快速上分吃鸡
  20. 西密歇根大学计算机科学专业排名,西密歇根大学计算机科学专业硕士申请条件及案例分享...

热门文章

  1. 【狐记】一心如旧(剑网3·侠肝义胆沈剑心 第二季ED)
  2. C语言: 求N分之一序列前N项和.2021-07-13
  3. CSS之linear-gradiend ——实现条纹背景效果
  4. 写作助手-合并md文件-1607419541922,一线大厂架构师都推荐的Android零基础大全
  5. 当今海外有多少国名“拜中国所赐”?
  6. JavaScript运算符的优先级
  7. matmul torch 详解_[pytorch] 通过一个例子分析torch.matmul矩阵与向量相乘的维度
  8. Openlayers加载离线地图Arcgis瓦片
  9. cesium加载离线tms切片
  10. RHEL9.0 安全启动提示Verification failed: (0x1A) Secureity Violation解决方法