获取按日期排序的最后记录的最佳性能方法

Posted

技术标签:

【中文标题】获取按日期排序的最后记录的最佳性能方法【英文标题】:Best performance aproach for get the last records sorted by date 【发布时间】:2020-08-05 18:21:11 【问题描述】:

我有一个包含超过 6000 万条记录的表。该表有 510 列。所有列都是双精度的。

我为日期字段创建了索引:

CREATE INDEX index_btree_date ON mytable USING BTREE (date);

表格如下所示:

--------------------------------------------------------------
| id | date                | fk_system | col1 | col2 | col-n |
--------------------------------------------------------------
| 1  | 2020-08-05 15:00:00 | 1         | 1    | 2    | 3     |
--------------------------------------------------------------
| 2  | 2020-08-05 15:00:00 | 2         | 1    | 2    | 3     |
--------------------------------------------------------------
| 3  | 2020-08-05 15:01:00 | 1         | 1    | 2    | 3     |
--------------------------------------------------------------
| 4  | 2020-08-05 15:01:00 | 2         | 1    | 2    | 3     |
--------------------------------------------------------------
| 5  | 2020-08-05 15:02:00 | 1         | 1    | 2    | 3     |
--------------------------------------------------------------
| 6  | 2020-08-05 15:02:00 | 2         | 1    | 2    | 3     |
--------------------------------------------------------------
| 7  | 2020-08-05 15:03:00 | 1         | 1    | 2    | 3     |
--------------------------------------------------------------
| 8  | 2020-08-05 15:03:00 | 2         | 1    | 2    | 3     |
--------------------------------------------------------------

我尝试运行此查询:

SELECT t.id, t.date, t.fk_system, t.col1, t.col2, t.col3 
FROM mytable t 
WHERE t.fk_system = 106 
ORDER BY t.date DESC 
LIMIT 2880;

此查询运行时间超过 5 分钟,性能非常差。

有人可以帮我吗?

谢谢!

【问题讨论】:

注意:date 是列的错误名称。这是一个非常糟糕的时间戳名称。 【参考方案1】:

对于这个查询:

SELECT t.id, t.date, t.fk_system, t.col1, t.col2, t.col3
FROM mytable t
WHERE t.fk_system = 106
ORDER BY t.date DESC
LIMIT 2880;

您希望在(fk_system, date desc) 上建立索引。 date 的第一个索引对这个查询没有帮助。

【讨论】:

以上是关于获取按日期排序的最后记录的最佳性能方法的主要内容,如果未能解决你的问题,请参考以下文章

获取有关Spring Data数据的最后记录

NSFRC 核心数据获取最后的记录

Spark Scala:在使用 spark 按不同日期排序后,需要获取具有 NULL 日期的记录

Eloquent 获取按日期分组的最后一条记录

SQL 按日期排序并按用户获取结果

使用 mysql 从结果集中获取最后 4 行的最佳方法