Postgresql 它';It’要得到我表的最后一个值,时间越来越长了

Postgresql 它';It’要得到我表的最后一个值,时间越来越长了,postgresql,datetime,indexing,Postgresql,Datetime,Indexing,我的Postgres数据库中有一个表,每10分钟存储一次值。现在该表中有很多记录(我不想删除旧记录)。基本上,行包含一个值和一个时间戳。我的SQL请求没有优化,因为它似乎在整个表中循环 SELECT value, date FROM measures order by date desc limit 1 我还尝试在日期上添加一个过滤器,例如: SELECT value, date FROM measures WHERE date > date '2011-10-20' order by

我的Postgres数据库中有一个表,每10分钟存储一次值。现在该表中有很多记录(我不想删除旧记录)。基本上,行包含一个值和一个时间戳。我的SQL请求没有优化,因为它似乎在整个表中循环

SELECT value, date FROM measures order by date desc limit 1
我还尝试在日期上添加一个过滤器,例如:

SELECT value, date FROM measures WHERE date > date '2011-10-20' order by date desc limit 1
(当然日期是动态的)。但同样的事情


需要索引还是可以优化查询?

首先-+1用于动态查询。没错,由于没有索引,您的查询速度越来越慢,每次查询值时都要进行完整的表扫描。我不是一个强大的postgres DB用户,但看起来确实可以在日期字段上放置索引(因为这是您主要查询的内容)

另一个常见的例子是查找给定日期的行,其中 我们已将时间戳存储在datetime字段中,但希望通过 日期浇铸值。索引

可由包含


根据您的具体情况,您可能会在这篇文章中发现一些其他有趣的信息。

首先,您不应该命名时间戳列
日期
。A.此外,虽然它在PostgreSQL中是允许的,但它在任何SQL标准中都是一个标准。(不过,为了回答这个问题,我将坚持使用
date

除此之外,没有必要像Tommy建议的那样使用和
WHERE
子句。(
日期(创建时间)
)。一个普通的B-树索引和一个没有
WHERE
子句的查询使工作更简单、更快

CREATE INDEX measures_date_idx ON measures(date);
然后,您的查询将按原样工作,并快速启动。B树索引可以用于升序和降序排序,同样有效。阅读手册中关于的章节-涵盖您需要了解的案例的大部分内容


如果您的表非常大,并且您担心索引大小,那么可以使用来大幅减小大小。像这样:

CREATE INDEX measures_date_idx ON measures(date)
WHERE date > '2011-10-20 00:00:00'::timestamp;
SELECT value, date
FROM   measures
WHERE  date > '2011-10-20 00:00:00'::timestamp
ORDER  BY date DESC
LIMIT  1;
然后,您的查询必须包含与用于部分索引完全相同的
WHERE
子句。像这样:

CREATE INDEX measures_date_idx ON measures(date)
WHERE date > '2011-10-20 00:00:00'::timestamp;
SELECT value, date
FROM   measures
WHERE  date > '2011-10-20 00:00:00'::timestamp
ORDER  BY date DESC
LIMIT  1;

谢谢你,汤米。在代码中,您的意思是创建而不是发布,不是吗?对不起,这是从我链接到的文章中复制的:)