gpt4 book ai didi

mysql - 从数据库获取最后一条记录的有效方法

转载 作者:行者123 更新时间:2023-11-29 22:21:06 24 4
gpt4 key购买 nike

我有一个具有以下表结构的数据库:

id | entry | log_type  | user_id | created_on   |
------------------------------------------------|
1 |a | error | 1 | 1433752884000|
2 |b | warn | 2 | 1433752884001|
3 |c | error | 2 | 1433752884002|
4 |d | warn | 4 | 1433752884003|

我想根据created_on字段从表中获取最后一条记录,目前我正在使用以下查询来获取结果列表并使用java获取其上的最后一条记录:

select * from log_table l where l.user_id=2 and l.log_type = 'error' order by l.created_on desc;

我正在使用 JPA,并且在 Query 接口(interface)上使用 .getResultList() 执行查询。一旦获得结果列表,我就会执行 get( 0) 获取所需的最后一条记录。

我有一个包含太多数据的大表,上面的查询执行时间太长并导致应用程序停止。我现在无法在现有数据上添加额外的索引。除了在数据上添加索引之外,还有另一种方法可以避免此查询停滞。

我正在考虑执行以下查询,

select * from log_table l where l.user_id=2 and l.log_type = 'error' order by l.created_on desc limit 1;

目前我无法在数据库上执行第二个查询,因为它可能会导致我的应用程序停止运行。第二个查询的执行速度会比第一个查询快吗?

我没有足够大的数据集来重现本地系统上的停顿问题,因此 .我尝试在本地数据库上执行查询,由于缺乏可用的大型数据集,无法确定在返回的查询上添加“limit”后第二个查询是否会更快。

如果上面的第二个查询不应该提供更好的结果,我应该采取什么方法来获得优化的查询。

如果第二个查询应该足够好以避免停滞,是否是由于数据库仅获取一条记录而不是整个记录集的原因?与查找/获取太多记录(如在第一个查询中)相比,数据库对单个记录的查找/获取是否有所不同,以改善查询时间。

最佳答案

性能取决于...

ORDER BY x LIMIT 1

是一种常见的模式。它可能非常高效,也可能不太高效——这取决于查询和索引。

就您而言:

where l.user_id=2 and l.log_type = 'error' order by l.created_on desc

这将是最佳的:

INDEX(user_id, log_type, created_on)

使用该索引,它实际上会进行一次探测来查找您需要的行。如果没有该索引,它将扫描大部分或全部表,按降序排序 (ORDER BY .. DESC) 并交付第一行 (LIMIT 1)

关于mysql - 从数据库获取最后一条记录的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30705604/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com