按缩放的日期时间索引 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 将始终是唯一的数字,它将帮助索引更快地搜索查询。
我有一个很大的 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 将始终是唯一的数字,它将帮助索引更快地搜索查询。