mysql菜鸟教程

专栏导航

13.1 什么是索引?为什么需要它?

      在日常生活中,当我们想在一本厚厚的书中找到某个特定主题时,通常不会从第一页开始逐页翻阅,而是直接查看书末的索引(目录),它会告诉我们关键词所在的页码,从而快速定位。在数据库中,索引扮演的正是这样的角色——它是一种用于加速数据检索的数据库对象。

一、索引的直观比喻

      想象一下,你有一个巨大的Excel表格,里面存储了全校一万名学生的信息,包括学号、姓名、班级、电话等。现在你要查找学号为“2024001”的学生。如果没有索引,数据库就像你从头到尾一页页翻看这个表格,逐行对比学号,直到找到目标行。这种查找方式称为全表扫描,当数据量很大时,会非常耗时。

如果我们在“学号”列上建立了索引,数据库就会维护一个类似于“学号 → 记录位置”的映射表(通常以B+树等数据结构组织)。查找时,直接通过这个映射快速定位到记录所在的物理位置,就像根据书后的索引页码直接翻到对应页一样,效率会提升成千上万倍。

二、索引的核心作用

索引的主要目的是加快查询速度,具体体现在:

  • 快速定位:通过索引结构(如B+树)快速找到满足条件的行,避免全表扫描。

  • 排序优化:索引本身是有序的,可以帮助 ORDER BY 和 GROUP BY 操作更快完成,避免额外排序。

  • 唯一性保证:唯一索引可以保证列值的唯一性,防止重复数据。

三、索引的代价

索引并非免费午餐,它也有自己的开销:

  1. 占用额外存储空间:索引本身也是一张表(或数据结构),需要占用磁盘空间。如果索引过多,可能比数据本身还大。

  2. 降低写入性能:当对表进行 INSERTUPDATEDELETE 操作时,不仅要修改数据,还要同步维护所有相关的索引,因此会降低写入速度。

  3. 维护成本:随着数据变化,索引需要动态维护(如B+树的分裂与合并),这也会消耗CPU资源。

因此,索引的设计需要在查询性能写入性能之间做出权衡。对于读多写少的表,可以适当多建索引;对于频繁写入的表,则要谨慎添加索引。

四、索引的工作原理(简化版)

      MySQL中最常用的索引类型是 B+树索引。简单来说,B+树是一种平衡多路查找树,它将索引列的值组织成树状结构。查找时从根节点出发,通过比较值的大小快速定位到叶子节点,叶子节点中存储了指向实际数据行的指针(或直接存储了数据)。整个过程的时间复杂度通常为对数级(O(log n)),远快于全表扫描的线性时间(O(n))。

其他索引类型还包括:

  • 哈希索引:基于哈希表实现,只能用于等值比较(=),速度极快,但不支持范围查询。

  • 全文索引:用于对文本内容进行关键词搜索。

  • 空间索引:用于地理空间数据。

五、没有索引的查询有多慢?

假设有一个包含 1000 万行记录的表,没有索引时执行以下查询:

SELECT * FROM users WHERE username = 'zhangsan';

数据库必须从第一行开始,逐行读取并检查 username 是否等于 'zhangsan',平均需要读取 500 万行才能找到结果(假设结果唯一)。磁盘 I/O 和时间开销巨大。

如果为 username 列建立了索引,数据库可以几乎瞬间定位到该用户名对应的行,通常只需要几次磁盘 I/O 就能完成。

六、何时应该创建索引?

以下情况适合创建索引:

  • 经常作为查询条件的列(WHERE 子句中频繁使用的列)。

  • 经常需要排序或分组的列(ORDER BYGROUP BY)。

  • 用于连接其他表的列(JOIN 条件中的外键列)。

  • 具有唯一性要求的列(唯一索引)。

以下情况应避免创建索引:

  • 数据量很小的表(全表扫描比索引还快)。

  • 频繁更新的列(索引维护成本高)。

  • 列中重复值非常多(如性别字段,索引选择性差,效果有限)。

七、小结

  • 索引 是一种用于加速数据检索的数据库对象,类似于书的目录。

  • 它通过减少需要扫描的数据量来大幅提升查询性能,但会占用额外空间并降低写入速度。

  • MySQL 中最常用的是 B+树索引,适合范围查询和排序。

  • 索引的设计需要根据实际业务平衡查询效率与写入开销。

在接下来的章节中,我们将学习如何创建、查看和优化索引,以及如何分析查询是否有效利用了索引。


所有评论

关于我 备案号:蜀ICP备2023042032号-1