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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 14:40:18