按缩放的日期时间索引 SQL table

Indexing an SQL table by datetime that is scaling

我有一个很大的 table,每分钟可以获取 1-3 个新条目。我需要能够在特定时间找到记录,这可以通过使用 SELECT 语句来完成,但速度非常慢。假设 table 看起来像这样:

Device |     Date-Time     | Data |
-----------------------------------
1      | 2020-01-01 08:00  | 325
2      | 2020-01-01 08:01  | 384
1      | 2020-01-01 08:01  | 175
3      | 2020-01-01 08:01  | 8435
7      | 2020-01-01 08:02  | 784
.
.
.

我正在尝试获取这样的数据:

SELECT *
FROM table
WHERE Date-Time = '2020-01-01 08:00' AND Device = '1'

我也需要这样获取数据:

SELECT *
FROM table
WHERE Date-Time > '2020-01-01 08:00' Date-Time < '2020-01-10 08:00' AND Device = '1'

但我不知道 Date-Time 会是什么,直到有人提出要求。在这种情况下,我将不得不搜索整个 table 这些时间。我可以为一天的开始编制索引以便知道日期在哪里吗?

有没有办法索引这个 table 以显着减少查询?或者有更好的方法来实现这个目标吗?

我已经尝试索引 Date-Time 列,但我根本没有减少查询时间。

对于此查询:

SELECT *
FROM mytable
WHERE date_time = '2020-01-01 08:00' AND device = 1

您想要 mytable(date_time, device) 上的索引。这与 WHERE 子句中发挥作用的列相匹配,因此数据库应该能够有效地查找匹配的行。

请注意,我删除了给 device 的文字值周围的单引号:如果这是一个整数,就像它看起来的那样,那么它应该被这样对待。

索引中列的顺序很重要;通常,您首先需要最严格的列 - 从您的问题描述来看,这可能是 date_time,因此是上述建议。您可能还想尝试另一种方法(因此:mytable(device, date_time))。

从性能角度考虑的另一件事:您可能应该在 SELECT 子句中枚举所需的列;如果您只需要一些额外的列,那么将它们也添加到索引中会很有用;这为您提供了一个 覆盖 索引,数据库可以使用它来执行整个查询,而无需回头查看数据。

说:

SELECT date_time, device, col1, col2
FROM mytable
WHERE date_time = '2020-01-01 08:00' AND device = 1

然后考虑:

mytable(date_time, device, col1, col2)

或:

mytable(device, date_time, col1, col2)

您可以使用 TimeInMilliseconds 作为新列并用 1970 年以来的毫秒数填充它,并在此列上创建索引。 TimeInMilliseconds 将始终是唯一的数字,它将帮助索引更快地搜索查询。