Laravel中带deleted_at检查时MySQL Explain的filtered值从100降至10是否正常?
Laravel软删除查询的EXPLAIN结果分析
结论
这种情况属于正常行为,但从长期性能优化角度,建议给deleted_at列添加索引。
详细解释
rows值不变的原因:rows是MySQL优化器预估的需要扫描的行数。因为你查询用到的其他列已经建立了索引,优化器依然会优先通过这些索引定位候选数据集,所以扫描行数不会因为新增deleted_at过滤条件而改变——它会先通过已有索引拿到目标行,再在这些行里过滤软删除记录。filtered值下降的原因:filtered代表优化器预估的、经过过滤后剩余有效行数占扫描行数的比例。从100%降到10%,说明优化器基于表统计信息判断,候选行中只有约10%是未被软删除的(即deleted_at IS NULL),这个预估是符合逻辑的正常结果。建议添加
deleted_at索引的原因:
当前查询逻辑是「先通过索引取数,再在内存中过滤软删除数据」,数据量小时性能影响不明显;但当表数据量增大后,内存过滤的开销会逐步上升。给deleted_at单独加索引,或者和其他查询字段组成联合索引(比如(查询列名, deleted_at)),能让优化器直接定位到未被软删除的有效数据,减少不必要的行扫描和内存过滤,提升查询效率。
结合截图的补充说明
从你提供的两张EXPLAIN结果来看:
- 带
deleted_at检查的结果:优化器仍在使用原有索引,只是多了一层deleted_at IS NULL的过滤逻辑 - 无
deleted_at检查的结果:不需要过滤,所以filtered为100%
如果当前查询性能在可接受范围内,暂时不添加索引也没问题,但数据量增长后务必考虑索引优化。
内容的提问来源于stack exchange,提问作者magicianiam
相关产品推荐
相关产品推荐

