【发布时间】:2013-06-10 05:23:18
【问题描述】:
如果您查询日期范围和其他内容,那么将日期列作为索引中的前沿是否是一件坏事?
我使用的是 PostgreSQL,但假设这适用于所有 B 树索引。
假设我查询了创建日期为 2013-01-02 或更晚且状态为“活动”的记录。我对 B 树索引如何组织日期很模糊,但这就是我的想象。如果索引打开(创建,状态),它的结构大致如下:
created status
------------------------
2013-01-01 Active
2013-01-01 Inactive
2013-01-02 Active <-- This record is selected
2013-01-02 Inactive
2013-01-03 Active <-- This non-adjacent record is selected (SLOW)
2013-01-03 Inactive
如果索引开启(状态,创建):
status created
------------------------
Active 2013-01-01
Active 2013-01-02 <-- This record is selected
Active 2013-01-03 <-- This adjacent record is selected (FAST)
Inactive 2013-01-01
Inactive 2013-01-02
Inactive 2013-01-03
所以在我看来,如果您使用日期作为前沿并查询这些日期的范围,那么您想要的记录会在索引中分散,导致性能下降。日期时间更糟。
【问题讨论】:
-
你是绝对正确的。看看这个:use-the-index-luke.com/sql/where-clause/searching-for-ranges/… 并考虑使用@MothOnMars 建议的部分/过滤索引
标签: oracle postgresql indexing b-tree