MySQL:优化简单查询

mwkjh3gx  于 2023-01-29  发布在  Mysql
关注(0)|答案(1)|浏览(107)

不用说,我不精通SQL。现在我必须对一个表运行查询,如下所示:

id, tp_id, value_1, value_2, value_3, date

对于每个不同的tp_id,此表都有2个条目,它们具有不同的值。tp_id是一个外键,在下表中对其进行了索引:

id, external_id

我尝试检索数据如下:
获取不同的tp_id,其中值2 = 2,值1 = 1|2,value_3 = 1,并且date〈now - 1年。对于具有匹配tp_id的两个条目,这些条件必须都为真
我已经尝试了下面的查询,但是据我所知,SUM函数与JOIN语句的配对使得查询太慢:

SELECT t1.tp_id, t2.external_id
FROM table_1 t1
JOIN table_2 t2 ON t1.tp_id = t2.id
GROUP BY t1.tp_id
HAVING 
  SUM(
    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)
  ) = 2;

这两个表大约有250万行。
我想优化此查询或学习更好的方法来实现此目的,因此欢迎提供任何帮助。
编辑:看来运行这个查询将完全没有必要。因此,我将结束这个问题,谢谢您的回答

ndh0cuux

ndh0cuux1#

如果我没理解错你的要求,像这样的东西可能会有帮助。

SELECT tp_id
FROM (
    SELECT t1.tp_id,count(*) as count
    FROM table_1 t1
    WHERE
      t1.value_2 = 2 
      AND (t1.value_1 = 1 OR t1.value_1 = 2) 
      AND t1.value_3 = 1 
      AND t1.date <= DATE_SUB(NOW(), INTERVAL 1 YEAR)
    GROUP BY tp_id
) as res 
WHERE res.count = 2

基本上,我做了3次性能更新:

  1. WHERE条件在GROUP BY之前应用,比HAVING性能高得多
    1.我使用了嵌套查询,但是您也可以根据MySQL版本使用HAVING COUNT(tp_id)= 2
  2. 2布尔检查应比IN子句性能更高

相关问题