mysql索引原理02--存储引擎索引的实现

发表于 2019-09-24 18:58 951 字 5 min read

Spring AI学习笔记(四)工具调用和MCPSpring AI学习笔记(三)RAG从文档入库到回答Spring AI学习笔记(二)ChatClient从怎么调到怎么封装Spring AI学习笔记(一)它到底解决什么问题java新版本-java25学习笔记(四)用JFR和GC日志做一次体检java新版本-java25学习笔记(三)虚拟线程要和资源边界一起看java新版本-java25学习笔记(二)运行时基线先统一java新版本-java25学习笔记(一)LTS版本对比和学习路线主流AI Agent能力对比与工程选型我用Kiro做了个自己的工具站盘一盘虚拟线程我用Trae做了个AstrBot的AI角色扮演插件Python初学笔记(六)常用标准库先学这几个Python初学笔记(五)读写文件和处理异常Python初学笔记(四)函数让代码开始有结构Python初学笔记(三)条件、循环和推导式Python初学笔记(二)变量和基础类型比想象中重要Python初学笔记(一)先把环境和运行方式弄明白主流AI大模型能力对比Java 21和Spring Boot 3升级笔记(五)日志指标与可观测性Java 21和Spring Boot 3升级笔记(四)数据访问层适配Java 21和Spring Boot 3升级笔记(三)虚拟线程使用边界Java 21和Spring Boot 3升级笔记(二)Jakarta迁移要点Java 21和Spring Boot 3升级笔记(一)工程基线整理魔法值怎么能忍!JPA的Specification大改造!处理生僻字乱码:JPA框架对于Oracle的NVarchar2,NChar,NClob类型支持Redis Stream能不能当轻量消息队列用RocketMQ 5学习笔记:普通消息之外要看什么事件流不是换个消息队列这么简单Kubernetes学习笔记04:发布、排障和观测Kubernetes学习笔记03:配置、密钥和存储Kubernetes学习笔记02:Deployment、Service和IngressKubernetes学习笔记01:Pod和控制器mysql索引原理02--存储引擎索引的实现mysql索引原理01--索引的数据结构
前情回顾   上一集讲到各种数据结构,以及解析了mysql为什么选用b+树作为索引的数据结构。这一集来讲一下mysql中索引在存储引擎中是如何实现的。这一篇过去以后,就能对整个索引有一个深刻的理解。   mysql有两个存储引擎:InnoDB和MyISAM。下面就来看一下这两个存储引擎里,索引都是如何实现的。 MyISAM...

前情回顾

  上一集讲到各种数据结构,以及解析了mysql为什么选用b+树作为索引的数据结构。这一集来讲一下mysql中索引在存储引擎中是如何实现的。这一篇过去以后,就能对整个索引有一个深刻的理解。   mysql有两个存储引擎:InnoDB和MyISAM。下面就来看一下这两个存储引擎里,索引都是如何实现的。

MyISAM

  MyISAM存储引擎是一个不支持事务的表级锁的存储引擎。它存储结构的特性是,索引以及数据是分开的。下面讲一个例子来说明一下:

  我们在mysql中建立一个库demo_database下建立一个表t_test_myisam,将存储引擎设置成MyISAM

  然后在mysql目录下的/data/demo_database可以看到mysql建立了两个文件。分别是t_test_myisam.MYD和t_test_myisam.MYI
  上面我们说了,MyISAM存储引擎存储的特性就是将索引和数据分开。没错,这两个文件,,一个是保存索引的,一个是保存数据的。   .MYI文件是索引文件,上一篇文章中介绍的索引的树状结构就是保存在这一个文件里面。   .MYD文件是数据文件,住要保存的是数据表里的数据。   如下图的结构,树状结构部分是MYI文件保存的索引部分,右边的表格数据内容则是MYD文件保存的部分,索引的叶子节点带有一个指针,指向MYD文件中所保存的表数据。

InnoDB

  InnoDB是一个支持事务而且支持行级锁的存储引擎。它的存储特性是将索引和数据储存在一起的。   我们继续在mysql中建立一个库demo_database下建立一个新的表,命名为t_test_innodb,将存储引擎设置成InnoDB

  然后在mysql目录下的/data/demo_database可以看到mysql建立了1个文件:t_test_innodb.idb
  很明显的,这个文件就是InnoDB的存储文件,这个文件既保存了索引也保存了表数据。它的结构可以看下图:
  大家可以发现,本来在MyISAM中叶子节点保存指针的地方变成了保存数据信息。和就是InnoDB在储存时的特性。而这个索引保存方式,也被称为聚集索引。

InnoDB引发思考

  InnoDB是鼓励数据表是一定要建立一个主键的,而且最好是整型的自增主键。为什么要这样限制呢?我们可以从InnoDB的存储结构思考。 1.一定要建立主键。 根据上面的了解,我们现在知道InnoDB将索引和数据存储在一起的。那么可以想一下,假如没有主键,那么是不是数据表就没有了主键索引,那么我们数据会保存在哪里?这样一想是不是就能知道一定要建立主键的原因了。 2.主键要用整型自增主键 这个其实是和查询有关系的,做个比喻,有好一些业务系统中,主键都是用uuid的,这种做法的坏处是,假如我们不管是查询,还是插入修改等操作,在根据主键搜索的时候,在各个索引值比对的时候会存在一个问题,就是字符串比对得转换成ASCII码进行比对,这样效率很明显是降低的。这也就是我们提倡使用整型自增主键的原因,不管是插入,还是查询,效率都会比较高。

喜欢的话,留下你的评论吧~

© 2019 - 2026 VincentHo @VincentHo
Powered by theme astro-koharu · Inspired by Shoka