PostgreSQL - 状态字段的右索引选择(varchar)

时间:2017-01-05 10:07:20

标签: sql postgresql

我有一个包含大量条目的表和一个长度为8的varchar字段,表示不同的状态。只有大约5种不同的状态,比如'STATUS1','STATUS2',......大部分时间都是NULL。

当我为该字段编制索引时,它没有做太多,因为有很多相等的值,然后postgres不使用索引。

我的问题是:有没有办法对这样的字段进行索引并使其更快?大部分时间我查询status IS NULL,我认为我无法加快速度。但是如果我检查status = 'STATUS1'怎么办?

1 个答案:

答案 0 :(得分:4)

在某些情况下,您可以使用partial indexes。假设您有很多类似于

的查询
SELECT *
  FROM the_table
 WHERE color in ('green', 'blue') AND status = 'STATUS1' ;

如果您创建partial index

,此查询最有可能(更快)运行
CREATE TABLE the_table
(
   color text, 
   status character varying(8)
    /* and anything you need */
) ; 

CREATE INDEX
  ON public.the_table (color)
  WHERE status = 'STATUS1' ;

如果使用PostgreSQL(任何其他允许它的数据库),我可能也会创建一个enumerated type,而不是varchar。你有两个好处:只允许枚举值(所以“autochecking”),并且存储信息(和索引)所需的空间小于varchar(8):

CREATE TYPE status_type AS ENUM
   ('STATUS1',
    'STATUS2',
    'STATUS3');

然后用它创建表:

CREATE TABLE the_table
(
   color text, 
   status status_type
    /* and anything you need */
) ; 

如果您需要(以编程方式)知道哪些是枚举的允许值(例如,创建菜单),check here

如果数据库不允许枚举,我会规范化为(anonymous_id_PK,status_value)对的小[ish]表。