MySQL简单查询优化:满足双行条件的tp_id查询提速
优化方案
先建立关键索引
首先给table_1创建覆盖过滤条件的复合索引,这是提升查询速度的核心:
CREATE INDEX idx_table1_filter ON table_1 (value_2, value_3, value_1, date, tp_id);
这个索引包含了所有过滤字段和需要的tp_id,查询时无需回表读取原数据,大幅减少IO开销。
优化后的查询语句
方式一:先过滤再分组(推荐)
先筛选出符合条件的记录,再分组统计每个tp_id的有效记录数,最后关联table_2:
SELECT filtered.tp_id, t2.external_id FROM ( SELECT tp_id FROM table_1 WHERE value_2 = 2 AND value_1 IN (1, 2) AND value_3 = 1 AND date <= DATE_SUB(NOW(), INTERVAL 1 YEAR) GROUP BY tp_id HAVING COUNT(*) = 2 ) AS filtered JOIN table_2 t2 ON filtered.tp_id = t2.id;
原查询的问题在于先做全表JOIN再分组,处理了大量不符合条件的数据;这个方案先缩小数据集,只对符合条件的记录分组,计算量大幅降低。
方式二:用EXISTS验证双记录
如果table_1的id是唯一主键,可以用EXISTS检查同tp_id下的另一条记录是否也满足条件:
SELECT DISTINCT t1.tp_id, t2.external_id FROM table_1 t1 JOIN table_2 t2 ON t1.tp_id = t2.id WHERE t1.value_2 = 2 AND t1.value_1 IN (1, 2) AND t1.value_3 = 1 AND t1.date <= DATE_SUB(NOW(), INTERVAL 1 YEAR) AND EXISTS ( SELECT 1 FROM table_1 t1_dup WHERE t1_dup.tp_id = t1.tp_id AND t1_dup.id != t1.id AND t1_dup.value_2 = 2 AND t1_dup.value_1 IN (1, 2) AND t1_dup.value_3 = 1 AND t1_dup.date <= DATE_SUB(NOW(), INTERVAL 1 YEAR) );
EXISTS是半连接查询,找到匹配的记录就停止遍历,效率很高,适合验证“两条记录都满足”的场景。
编辑:经确认该查询已无需执行,特此关闭问题,感谢各位解答。
内容的提问来源于stack exchange,提问作者Grégory Denis
相关产品推荐
相关产品推荐

