MySQL中多次复用过滤结果的高效实现方案咨询
高效统计多平台记录数的优化方案
你的问题根源在于重复执行相同的过滤逻辑,多次扫描数据导致耗时高,临时表又因数据体积带来额外CPU负载。最直接的优化方式是只做一次过滤,再基于过滤结果完成多维度统计,用条件聚合就能实现。
优化后的SQL代码
SELECT COUNT(CASE WHEN service LIKE '%youtube%' THEN 1 END) AS youtube_count, COUNT(CASE WHEN service LIKE '%facebook%' THEN 1 END) AS facebook_count, COUNT(CASE WHEN service LIKE '%twitter%' THEN 1 END) AS twitter_count FROM report WHERE user_id = 1 AND created_at < '2023-03-01'
为什么这个方案更高效
- 仅扫描一次符合
user_id和created_at条件的数据,彻底避免了多子查询重复过滤的开销 - 无需创建临时表,减少了内存和CPU的额外消耗
- 逻辑简洁,后续新增平台统计只需加一行
CASE WHEN即可,维护成本低
额外索引优化建议
如果想进一步提速,给表创建复合索引:
CREATE INDEX idx_report_user_created ON report(user_id, created_at);
这个索引能让数据库快速定位到符合user_id和日期范围的数据,不用全表扫描。注意:service字段的%xxx%模糊查询无法利用索引,所以只能靠前置过滤缩小数据范围来提升统计速度。
内容的提问来源于stack exchange,提问作者Web Star
相关产品推荐
相关产品推荐

