MySQL数据库,详解索引原理(五)
Mysql的存储引擎和索引
mysql内部索引是由不同的引擎实现的,主要说⼀下InnoDB和MyISAM这两种引擎中的索引,这两种引擎中的索引都是使⽤b+树的结构来存储的。
InnoDB中的索引
Innodb中有2种索引:主键索引(聚集索引)、辅助索引(⾮聚集索引)。
主键索引:每个表只有⼀个主键索引,b+树结构,叶⼦节点同时保存了主键的值也数据
记录,其他节点只存储主键的值。
辅助索引:每个表可以有多个,b+树结构,叶⼦节点保存了索引字段的值以及主键的值,其他节点只存储索引指端的值。
MyISAM引擎中的索引
B+树结构,MyISM使⽤的是⾮聚簇索引,⾮聚簇索引的两棵B+树看上去没什么不同,节点的结构完全⼀致只是存储的内容不同⽽已,主键索引B+树的节点存储了主键,辅助键索引B+树存储了辅助键。表数据存储在独⽴的地⽅,这两颗B+树的叶⼦节点都使⽤⼀个地址指向真正的表数据,对于表数据来说,这两个键没有任何差别。由于索引树是独⽴的,通过辅助键检索⽆需访问主键的索引树。
如下图:为了更形象说明这两种索引的区别,我们假想⼀个表存储了4⾏数据。其中Id作为主索引,Name作为辅助索引,图中清晰的显⽰了聚簇索引和⾮聚簇索引的差异。
我们看⼀下上图中数据检索过程。
InnoDB数据检索过程
如果需要查询id=14的数据,只需要在左边的主键索引中检索就可以了。
如果需要搜索name='Ellison'的数据,需要2步:
1. 先在辅助索引中检索到name='Ellison'的数据,获取id为14
2. 再到主键索引中检索id为14的记录辅助索引这个查询过程在mysql中叫做回表。
MyISAM数据检索过程
1. 在索引中找到对应的关键字,获取关键字对应的记录的地址
2. 通过记录的地址查找到对应的数据记录
我们⽤的最多的是innodb存储引擎,所以此处主要说⼀下innodb索引的情况,innodb中最好是采⽤主键查询,这样只需要⼀次索引,如果使⽤辅助索引检索,涉及到回表操作,⽐主键查询要耗时⼀些。
innodb中辅助索引为什么不像myisam那样存储记录的地址?
表中的数据发⽣变更的时候,会影响其他记录地址的变化,如果辅助索引中记录数据的地址,此时会受影响,⽽主键的值⼀般是很少更新的,当页中的记录发⽣地址变更的时候,对辅助索引是没有影响的。
我们来看⼀下mysql中页的结构,页是真正存储记录的地⽅,对应B+树中的⼀个节点,也是mysql中读写数据的最⼩单位,页的结构设计也是相当有⽔平的,能够加快数据的查询。
相关文章
- 直接在代码里面对list集合进行分页
- .NET Framework 4.5新特性详解
- 大数据的简要介绍
- 大数据的由来
- 高斯混合模型的自然梯度变量推理
- timing-wheel 仿Kafka实现的时间轮算法
- 使用Navicat软件连接自建数据库(Linux系统)
- 那一天,我被Redis主从架构支配的恐惧
- Redis 深入了解键的过期时间
- C#使用委托调用实现用户端等待闪屏
- 基于流计算 Oceanus 和 Elasticsearch Service 构建百亿级实时监控系统
- GRAND | 转录调控网络预测数据库
- JFreeChart API中文文档
- 临床相关突变查询数据库
- TIGER | 人类胰岛基因变化查询数据库
- 视频边缘计算网关EasyNVR在视频整体监控解决方案中的应用分析
- Apache Arrow - 大数据在数据湖后的下一个风向标
- 常见的电商数据指标体系
- AKShare-艺人数据-艺人流量价值
- MySQL中多表联合查询与子查询的这些区别,你可能不知道!