You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:09:55