SQLite最大值明显慢于最小值,组为

SQLite最大值明显慢于最小值,组为,sqlite,group-by,Sqlite,Group By,我有几个非常大的数据库,我正在尝试运行一些查询。讨论中的表格具有以下(简化)格式,其中包含一些示例数据。此处没有表示其他列: uuid | groupId | timestamp 1 | 1 | 01-01-2020 12:30:00 2 | 2 | 01-01-2020 12:30:10 3 | 2 | 01-01-2020 12:30:30 4 | 2 | 01-01-2020 12:30:50 5 |

我有几个非常大的数据库,我正在尝试运行一些查询。讨论中的表格具有以下(简化)格式,其中包含一些示例数据。此处没有表示其他列:

uuid | groupId | timestamp
1    |       1 | 01-01-2020 12:30:00
2    |       2 | 01-01-2020 12:30:10
3    |       2 | 01-01-2020 12:30:30
4    |       2 | 01-01-2020 12:30:50
5    |       1 | 01-01-2020 12:31:00
6    |       3 | 01-01-2020 12:32:00
7    |       3 | 01-01-2020 12:34:00
8    |       3 | 01-01-2020 12:35:00
9    |       3 | 01-01-2020 12:36:00
我有一个索引
CREATE index,如果mytable上不存在myindex(groupid,timestamp)

我想编写一个查询来返回每个groupId最早和最新的条目。我提出了以下建议:

SELECT uuid,
       min(timestamp) AS timestamp,
       groupid
FROM mytable
GROUP BY groupid
UNION ALL
SELECT uuid,
       max(timestamp) AS timestamp,
       groupid
FROM mytable
GROUP BY groupid;
返回我想要的结果。但是,使用
max
的下半场速度明显慢于下半场,分别为23秒和2955秒

从select语句中省略
uuid
时,前半部分需要5.7秒,后半部分需要10.2秒。我曾考虑添加一个覆盖索引,但在我的实际查询中,我选择了更多的列,索引的大小将是巨大的

我正在运行此操作的数据库是177GB,该表包含4000万行。它在NVMe驱动器上

在48GB数据库上运行查询,最小一半需要4秒,最大一半需要33秒


如何加快此查询速度或实现不同的查询以获得所需的结果?

因此,您需要的是每个groupid具有最大和最小时间戳的完整行?这是正确的,基本上这实际上返回了您想要的结果?您的时间戳字符串的格式不能进行有意义的排序。@SebastienCollier您是对的,您的代码比我用窗口函数发布的代码要快得多(这就是我删除它的原因)。我在一张大桌子上测试了一个类似的案例。此外,使用已有的复合索引,代码速度更快。但我没有发现两个联合查询的执行时间有任何差异。@Shawn抱歉,在我的数据库中,我的时间戳格式正确,可以排序,我刚刚在这里键入了一个简化的示例。