大表查询慢的核心是扫描行数过多,需结合查询条件、数据分布和执行计划精准优化;避免WHERE中函数、隐式转换或OR导致索引失效;务必用EXPLAIN分析执行计划并定期ANALYZE TABLE更新统计信息。
大表查询慢,核心问题常是扫描行数过多。减少扫描行数不是靠“加索引”一句话解决,而是要结合查询条件、数据分布、执行计划,精准缩小数据库实际读取的数据范围。
即使有索引,如果WHERE中用了函数、类型隐式转换或OR连接多个非等值条件,索引可能失效,导致全表扫描。例如 WHERE YEAR(create_time) = 2025 会跳过索引;应改写为 WHERE create_time >= '2025-01-01' AND create_time 。
当SELECT字段和WHERE条件都能被同一个索引包含时,MySQL可直接从索引中获取全部所需数据,无需回主键索引查找行记录——这能显著减少IO和扫描行数。
id = 123,若存在联合索引 (user_id, status),就构成覆盖索引加LIMIT不等于减少扫描行数——如果ORDER BY字段无索引,MySQL仍需先排序全部匹配行,再取前N条。扫描行数可能远超LIMIT数值。
优化不能靠猜。每次调优前,先用 EXPLAIN 看实际执行计划,重点关注 rows(预估扫描行数)、key(实际使用的索引)、Extra(是否有Using filesort/Using temporary)。