在MySQL的性能优化中,索引是最常用且有效的手段之一。但“索引不是万能药”——盲目添加索引可能导致写操作变慢、存储空间浪费,甚至引发索引失效问题。本文将结合原理与实战场景,帮你理清“何时该用索引”的核心判断逻辑。
一、先理解索引的本质:用空间换时间的“查询加速器”
MySQL的索引本质上是一种数据结构(最常用的是B+树),它通过预先排序字段值,将全表扫描的O(n)复杂度降低到O(log n)。但索引的维护需要成本:
- 写入时:每次INSERT/UPDATE/DELETE都需要更新索引树(尤其是主键索引,InnoDB的聚簇索引结构会直接关联数据页);
- 存储时:每个索引都会占用额外的磁盘空间(相当于复制一份字段数据并按规则排序);
- 查询时:复杂的联合索引或错误的索引顺序可能导致“索引失效”,反而需要回表扫描。
因此,索引的价值仅体现在“高频查询场景”——当某个字段的查询频率远高于写入频率时,添加索引才划算。
二、必须添加索引的4类典型场景
场景1:高频过滤条件(WHERE子句核心字段)
如果某条SQL语句每天执行10万次,而其中WHERE user_id = 123的条件占80%,那么user_id字段必须加索引。
原理:没有索引时,MySQL需要扫描全表(假设表有1000万行,扫描需要约1秒);添加索引后,通过B+树快速定位到目标行(耗时约1ms)。
示例:
-- 高频查询:按用户ID查询订单
SELECT * FROM orders WHERE user_id = 100

最低0.47元/天 解锁文章
1257

被折叠的 条评论
为什么被折叠?



