总结
IO操作的耗时远高于CPU计算,而且数据库的大部分数据都存储在磁盘上,因此数据库设计的核心目标之一就是:减少IO次数
MySQL 中的索引是提升查询性能的核心机制,本质上是一种高效查找的数据结构。在 InnoDB 引擎中,索引底层主要采用 B+ 树 实现。
首先,InnoDB 的表必须有一个聚集索引(Clustered Index),通常是主键。它的特点是:数据行和索引存储在一起,叶子节点直接保存完整的用户数据。因此,通过主键查询只需要一次 I/O,效率最高。
除此之外的索引都叫二级索引(Secondary Index),也称为非聚簇索引。它的叶子节点不存完整数据,而是存储主键值。当执行非主键查询时,MySQL 先通过二级索引找到主键,再回表到聚集索引中获取完整数据——这个过程叫回表查询,会带来额外开销。
为了优化回表,我们可以设计覆盖索引,即让查询所需的所有字段都包含在索引中,这样就无需回表了。比如 SELECT id, name FROM users WHERE name = 'Tom',如果 (name, id) 有联合索引,就能直接返回结果。