贝利信息

mysql索引是什么_mysql索引原理与作用

日期:2026-01-09 00:00 / 作者:P粉602998670
索引是减少磁盘IO的物理手段,本质是排序的“小表”,存列值和数据行地址;B+树结构支持高效查找、范围查询与排序;需依执行计划评估,避免无效索引。

索引就是数据库的“目录”,不是加速查询的魔法,而是减少磁盘 IO 的物理手段

MySQL 索引本质是一张额外的、排序过的“小表”,里面存的是 列值 + 对应数据行的磁盘地址(或主键)。它不改变原表数据,但让查询不用扫全表——比如查 WHERE name = '张三',有索引时,MySQL 直接在索引 B+ 树里二分查找,定位到叶子节点,再按地址取数据;没索引就得从第一页磁盘读到最后一行,IO 次数可能差几十倍。

什么时候该建索引?看执行计划比凭感觉靠谱得多

别猜“这列经常 where 就该加索引”。先用 EXPLAIN 看 MySQL 实际怎么走的:

EXPLAIN SELECT * FROM users WHERE status = 1 AND created_at > '2025-01-01';

重点关注 type 字段:ALL 是全表扫描(危险),rangeref 才算走了索引;key 显示实际用的索引名;rows 是预估扫描行数——如果远大于结果集,说明索引效率低或没选对。

常见踩坑:这些“看起来合理”的索引其实无效

很多线上慢查询,根源不是没建索引,而是建了但白建了:

建索引不是一劳永逸,得定期检查和清理

业务迭代后,旧索引可能长期未被使用,反而拖累写性能。InnoDB 提供了统计信息:

SELECT * FROM sys.schema_unused_indexes WHERE object_schema = 'your_db';

(需开启 performance_schema 并导入 sys 库)

真正难的从来不是“怎么建索引”,而是判断“要不要建”以及“建了之后它到底有没有被用上”。磁盘 IO 和 B+ 树层级是硬约束,所有优化都绕不开这两点。