我有一个包含大量条目的表和一个长度为8的varchar字段,表示不同的状态。只有大约5种不同的状态,比如'STATUS1','STATUS2',......大部分时间都是NULL。
当我为该字段编制索引时,它没有做太多,因为有很多相等的值,然后postgres不使用索引。
我的问题是:有没有办法对这样的字段进行索引并使其更快?大部分时间我查询status IS NULL
,我认为我无法加快速度。但是如果我检查status = 'STATUS1'
怎么办?
答案 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]表。