Прежде всего, вы не должны называть свой столбец отметки времени date
. «дата» не является «отметкой времени» . Кроме того, хотя это разрешено в PostgreSQL, это зарезервированное слово в любом стандарте SQL. (Однако для ответа на этот вопрос я буду придерживаться date
)
Кроме того, не нужно для индекса для выражения и предложения WHERE
, как предлагает Томми. (date(created_at)
). A обычный индекс 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;
Тогда ваш запрос должен включать точно такое же предложение WHERE
, которое используется для частичного индекса. Как это:
SELECT value, date
FROM measures
WHERE date > '2011-10-20 00:00:00'::timestamp
ORDER BY date DESC
LIMIT 1;