我應該如何索引兩個timestamp
列(即starts_at
和ends_at
),這幾乎總是會在查詢中一起使用(如starts_at >= ? AND ends_at <= ?
)?爲兩列創建複合索引或爲每一列分別編制索引?索引兩個「時間戳」列的最佳方法
順便說一句,我使用的Postgres,如果它的問題:)
我應該如何索引兩個timestamp
列(即starts_at
和ends_at
),這幾乎總是會在查詢中一起使用(如starts_at >= ? AND ends_at <= ?
)?爲兩列創建複合索引或爲每一列分別編制索引?索引兩個「時間戳」列的最佳方法
順便說一句,我使用的Postgres,如果它的問題:)
如果這兩列是具有低數量含正是相同的時間戳列的真實時間戳,那確實是一個沒有用複合鍵,因爲範圍掃描無法爲第一個選擇單個值。如果字段是日期,則這可能會有所不同,因爲頻繁的日期可以與時間戳不匹配的地方匹配。它有一個小的好處,但我的經驗是,它並不是很大。
如果您使用的是足夠大且密集的數據(如果單個索引掃描需要掃描大部分索引),則查詢計劃程序可以使用多個索引,並將它們與位圖結合使用。
http://www.postgresql.org/docs/current/static/indexes-bitmap-scans.html
像往常一樣與這種類型的問題,這是值得您的數據集上運行測試。
這是爲了後人的緣故,因爲我看到它很久以前就回答了。這假定Postgres 9.2+。如果你有一個日期範圍,你應該使用tsrange
爲您的數據類型:
create table events(
id serial primary key,
name text not null unique,
duration tsrange not null
);
關於範圍的好處是你可以做一些令人驚訝的查詢與他們,您的需求,這是最好的部分:
create index idx_event_duration on events
using GIST(duration);
現在,您可以查詢使用特殊運營商的各種:
select * from events where
duration @> (now() - interval '2 weeks');
You can read more about them here。這幾乎不能抓住他們可以做的事情的表面。
謝謝!是的,列是真實的「沒有時區的時間戳」。而具有完全相同值的行數量是可笑的低。我會嘗試使用單個索引。 –