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

如何通过索引提升MySQL/InnoDB表查询非软删除数据的效率?

软删除查询的索引优化方案

首先,单独给deletedDateTime建独立索引并不推荐。如果你的表中未软删除的数据占绝大多数(这是常见场景),InnoDB在执行deletedDateTime IS NULL查询时,需要扫描索引中大部分条目,还要回表取出完整数据,这种情况下性能甚至不如全表扫描高效。

最优方案:把deletedDateTime作为联合索引的最左前缀

因为几乎所有查询都会带上deletedDateTime IS NULL这个过滤条件,最合理的做法是将它和查询里常用的其他过滤、排序字段组合成联合索引,并且把deletedDateTime放在最前面。举几个例子:

  • 如果你的常用查询是WHERE deletedDateTime IS NULL AND user_id = ? ORDER BY update_time DESC,就创建索引:CREATE INDEX idx_del_user_update ON your_table (deletedDateTime, user_id, update_time);
  • 如果查询常按某个分类过滤,就建(deletedDateTime, category_id)的索引,后续还能按需添加排序字段

这种联合索引的好处是:MySQL可以直接通过索引快速定位到deletedDateTime IS NULL的所有条目,接着匹配后续的过滤条件,甚至能直接利用索引完成排序,避免额外的排序开销,大幅提升查询效率。

特殊场景:软删除数据占比极高

如果你的表中已软删除的数据占了绝大多数(比如90%以上),那单独给deletedDateTime建索引反而有用。因为此时deletedDateTime IS NULL的有效数据量很小,索引可以快速定位到这部分数据,避免扫描整个表。

额外提示

InnoDB的聚簇索引是按主键排序的,如果有效数据因为软删除操作变得分散,联合索引能把有效数据的索引条目集中在一起,减少磁盘IO次数,这也是联合索引比独立索引更优的原因之一。

内容的提问来源于stack exchange,提问作者Josh M.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:37:06