任何人都可以建议哪个sql查询更好地处理mysql中的大数据集

时间:2017-12-05 19:17:51

标签: sql

我必须在表中找到同一组的最大id行并显示roe细节。使用以下两种方法我们可以实现它。但是想知道哪种方法可以用于大数据。或者其他任何新方法都需要花费更少的时间来执行?感谢先进。

方法1:

select a.* from tab1 a left join (SELECT max(id) as id,name from tab1 
GROUP by name) as tab2 on a.id=tab2.id where a.id=tab2.id

方法2:

SELECT id,name from tab1 where id in(SELECT MAX(id) FROM tab1 GROUP by name)

2 个答案:

答案 0 :(得分:0)

取自手册(13.2.10.11将子查询重写为连接):

LEFT JOIN可能比子查询更快,因为 服务器可能能够更好地优化它。

因此子查询可能比LEFT [OUTER] JOINS慢,但在我看来,它们的强度略高于可读性。但由于第一种方法中有一个LEFT JOIN和一个子查询,第二种方法在大规模查询时可能会更快。

答案 1 :(得分:0)

您还可以使用窗口函数来避免自联接:

SELECT id, name 
FROM (
  SELECT 
    id, 
    name, 
    RANK() OVER(PARTITION BY name ORDER BY Id DESC) AS IdRankPerGroup
  FROM tab1
) src
WHERE IdRankPerGroup = 1

RANK()函数按照" name"命令每行。分组并根据" id"分配排名。每组内的价值。然后在外部查询中,您只需获得排名= 1的行。

尝试所有三个查询,查看EXPLAIN计划,看看哪一个最适合大量数据。