对于MySQL的用法和性能,哪个更好是多个小查询还是一个大查询?

时间:2019-07-12 08:57:16

标签: mysql database

我有成千上万的行数据,我想做下面的代码所示的事情。

   (SELECT Username, AddTime
     FROM Table1
     WHERE Type = 3 AND AddTime >= '2019-07-11 13:30:00' AND Username = 'Test1'
     LIMIT 1)
    UNION ALL
    (SELECT Username, AddTime
     FROM Table1
     WHERE Type = 3 AND AddTime >= '2019-07-11 13:40:00' AND Username = 'Test2'
     LIMIT 1);

我想要一个建议,是使用UNION ALL来使用上面显示的一个大查询,还是应该使用下面所示的多个小查询数千次呢?

如果我使用UNION ALL,那么在一个查询中将使用成千上万的UNION ALL。

SELECT Username, AddTime
     FROM Table1
     WHERE Type = 3 AND AddTime >= '2019-07-11 13:30:00' AND Username = 'Test1'
     LIMIT 1

注意:

  • 我正好有140k行数据。
  • 我使用UNION ALL在一个查询中尝试了大约100行,查询数据大约需要50秒。

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的操作:

SELECT tbl1.Username, tbl1.AddTime, min(tbl2.AddTime)
FROM Table1 tbl1
INNER JOIN Table1 tbl2 
ON tbl1.userName = tbl2.userName AND tbl1.type = tbl2.type and tbl2.addTime >= tbl1.addTime
WHERE type = 3  
AND tbl1.addTime >= '2019-07-11 13:30:00'
AND userName in ('Test1', 'Test2') 
AND tbl1.addTime <= DATE_ADD(tbl1.addTime, INTERVAL 5 MINUTE)  --optional but prob want to do something like this to limit result set
GROUP by tbl1.Username, tbl1.AddTime

请注意,我不在工作机器上,因此尚未进行测试。 同样,鉴于您提到的记录数量,您可能对此表具有一些索引以加快查询速度。最好的方法可能是在addTime,type和userName上包含覆盖索引,但要使用它来优化查询。