云计算·大数据 频道

MySQL 索引解析:让查询速度飙升的秘诀!

  1.前沿

  之前几篇文章,小编和大家分享了mysql innodb的内存结构,这次小编准备用两篇文章来和大家分享下mysql innodb的索引: mysql的基础知识 和 基于索引的sql优化 。

  2. 什么是索引?

  定义:索引是数据库中用于快速查找数据的机制,本质是某种数据结构。它存储着指向数据的指针,从而帮助数据库跳过不必要的行,直接定位到目标数据,减少扫描时间。

  比如我们看<<三国演义>>刘备三顾茅庐这章,如果没有目录,我们就需要一篇一篇的翻书,要翻很久,因为不知道在书的哪一页;但是如果有目录,我们是不是先在目录里面找到这章的目录,这章的目录对应着正文的书页,我们一下就可以翻到对应的书页,找到对应的章节。目录就类似于mysql的索引。

  3. 为什么需要索引?

  加速查询:索引可以显著减少数据库检索所需的时间。没有索引时,数据库会执行全表扫描(读取每一行),而索引让数据库只需要扫描部分数据。

  降低 I/O 负载:索引通过减少物理读取的次数,从而减少 I/O 操作。在大型数据集上尤其明显,特别是对于复杂查询或多表连接(JOIN)的场景。

  常见应用场景:索引在以下场景中最有用:

  WHERE 子句中的条件过滤。

  ORDER BY 语句进行排序时。

  GROUP BY 语句进行分组时。

  多表 JOIN 操作时匹配外键或其他相关列。

  4. 索引的类型

  主键索引:主键是表中唯一标识记录的字段,通常自动创建索引。InnoDB 存储引擎会将主键索引作为聚簇索引(Clustered Index),即数据的物理存储顺序和主键索引顺序一致。

  唯一索引:保证索引列中的所有值唯一性,类似于主键索引,但可以应用于非主键字段。

  普通索引:没有唯一性要求的索引,用于加速查询的非主键列。普通索引仅保证加速查找,没有其他约束。

  联合索引(复合索引):一个索引包含多个列,按照指定顺序进行索引。根据最左前缀原则,只要查询的条件从左开始匹配列的顺序,索引就可以生效。

  5. 索引的结构

  B-Tree 索引:MySQL 中最常见的索引结构是 B-Tree,特别是 InnoDB 存储引擎。B-Tree 索引通过一种平衡树结构,使得数据查找时间复杂度为 O(log n)。每个节点存储键值,并且有指向下层节点的指针。查询通过层次结构逐级缩小搜索范围,从而快速定位目标数据。

  哈希索引:哈希索引基于哈希函数,将键值映射为固定大小的哈希值。其特点是查询效率极高(O(1) 时间复杂度),但只适用于精确匹配的查询。不支持范围查询(例如 <、> 操作),因此哈希索引不适合大多数通用场景。

  这里强调一下:innodb只能创建B-Tree 索引,不支持哈希索引。即使创建的时候选择的是哈希,实际创建之后的结果也是B-Tree,有兴趣的同学可以试试,小编这里就不截图了。

  下面,小编用六条数据模拟下索引的结构。首先看下表结构:

  根据这个B+ 树索引结构图,小编简单的说下:

  绿色: 绿色框框表示页数,之前已经讲过,数据库的数据是以页的方式存储。

  红色: 红色框框表示是否是索引还是数据行,1:索引;0:数据。

  B+树的叶子节点存放的是完整的数据,非叶子节点存放的是索引数据。

  B+树的子节点可以有多个,这里是只用4条数据模拟,多了难得画。

  叶子节点的数据是有序的,根据主键id由小到大存储,并且行与行,页与页之间是用双向链表连接的。

  二级索引

  除了主键外,我们会根据查询的字段,也去建立相应的字段索引。小编这里就不画图了,二级索引的叶子节点放的是对应的主键索引值。

  回表

  指的是 MySQL 在通过二级索引查找到符合条件的记录后,还需要回到主键索引中去读取额外的列数据。因为索引只包含部分列的信息,如果查询中请求了索引中未包含的列,数据库就需要从主键索引中再次读取完整的行数据。

  比如user表中,我给name添加索引,我需要查询name=小九这行数据的信息,因为二级索引是没有完整的数据,所以mysql需要去主键索引里面找到对应的完整数据返回。

  覆盖索引

  指的是当一个索引完全包含了查询所需的所有列时,MySQL 不需要再回表,而是直接从索引中就可以返回结果。这种情况就称为覆盖索引。

  比如user表中,我给name添加索引,我需要查询name=小九这条数据的id,因为id在叶子节点已经有了,直接就返回了结果,不需要去主键索引再次查询。

  覆盖索引的优势:

  性能提升:避免了回表,降低了 I/O 和查询时间。减少表扫描:索引的存储比表的数据量小得多,索引扫描比全表扫描快。

  6. 总结

  索引是提升查询性能的关键工具,选择合适的索引类型和合理优化可以提高数据库效率。

  理解索引的类型和底层原理能够帮助开发者在构建数据库时做出明智的决策。

  最后。我创建了一个副业交流群,方便我的读者可以在群里讨论、交流大家尝试过的副业。但是任何人在群里打任何广告,都会被我T掉。

0
相关文章