索引是数据库中用于加速查询的额外结构,通过减少扫描行数、优化排序分组连接、保障唯一性来提升性能,但会增加存储和写操作开销,需合理选择高区分度字段创建。
索引是数据库中一种专门用来加速数据查找的结构,它不改变原始数据,而是额外建立一张“目录表”,里面存着字段值和对应数据行的位置信息。就像查字典时先看拼音或部首目录,而不是一页页翻找,MySQL 用索引跳过大量无关数据,直接定位目标记录。
没有索引时,MySQL 只能从第一行开始逐条比对,这叫全表扫描。表有10万行,最坏情况就要读10万次磁盘;加上索引后,可能只读3~5次就能定位到结果。这是因为索引本身体积小、结构有序(比如B+树),一次I/O能加载更多索引项,大幅提升效率。

当查询包含 ORDER BY、GROUP BY 或 JOIN 时,如果相关字段上有索引,MySQL 很可能直接利用索引已有的顺序,避免额外的内存排序或临时表。例如:
主键索引和唯一索引不只是为了查得快,它们同时强制列值不重复。插入或更新时,MySQL 会自动检查索引中是否已存在相同键值,若冲突则报错。这种校验逻辑内嵌在索引机制里,比应用层判断更可靠、更高效。
每建一个索引,都会带来三方面开销:
所以索引要建在真正被 WHERE、JOIN、ORDER BY、GROUP BY 频繁使用的字段上,优先选择区分度高(如用户ID)、重复值少的列。