如何找到需要索引的列?

时间:2019-02-20 19:27:50

标签: sql postgresql indexing

我开始学习SQL和关系数据库。下面是我的表格,它有大约1000万条记录。我的组合键是(reltype, from_product_id, to_product_id)

选择需要索引的列时应该遵循什么策略?另外,我已经记录了将在表上执行的操作。请帮助确定哪些列或哪些列组合需要索引?

表DDL如下所示。

表名:prod_rel

数据库架构名称:public

CREATE TABLE public.prod_rel (
reltype varchar NULL,
assocsequence float4 NULL,
action varchar NULL,
from_product_id varchar NOT NULL,
to_product_id varchar NOT NULL,
status varchar NULL,
starttime varchar NULL,
endtime varchar null,
primary key reltype, from_product_id, to_product_id)
);

对表执行的操作:

select distinct(reltype ) 
from public.prod_rel; 

update public.prod_rel  
   set status = ? , starttime = ? 
where from_product_id = ?;

update public.prod_rel  
   set status = ? , endtime = ? 
where from_product_id = ?;

select * 
from public.prod_rel  
where from_product_id  in (select distinct (from_product_id) 
                           from public.prod_rel 
                           where status = ? 
                           and action in ('A', 'E', 'C', 'P') 
                           and reltype = ? 
                           fetch first 1000 rows only);

注意:我没有执行任何JOIN操作。另外,请忽略表名或列名的大写字母。我才刚开始。

2 个答案:

答案 0 :(得分:2)

理想的是两个索引:

CREATE INDEX ON prod_rel (from_product_id);

CREATE INDEX ON prod_rel (status, reltype)
   WHERE action IN ('A', 'E', 'C', 'P');

您的主键(也使用索引来实现)不能支持查询2和3,因为from_product_id不在开头。如果将主键重新定义为from_product_id, to_product_id, reltype,则不需要我建议的第一个索引。

为什么订单很重要?想象一下,您正在图书馆中寻找一本书,该图书馆按“姓,名”的顺序排列。您可以使用此顺序快速查找“狄更斯”的所有书籍,但不能快速查找“查尔斯”的所有书籍。

但是让我也对您的查询发表评论。

如果存在许多不同的reltype值,则第一个将表现不佳;尝试在这种情况下提高work_mem。它始终是对整个表的顺序扫描,没有索引可以提供帮助。

答案 1 :(得分:0)

我已按照@a_horse_with_no_name的建议更改了主列的顺序,如下所示,并且仅为(from_product_id,reltype,status,action)列创建了一个索引。

CREATE TABLE public.prod_rel (
reltype varchar NULL,
assocsequence float4 NULL,
action varchar NULL,
from_product_id varchar NOT NULL,
to_product_id varchar NOT NULL,
status varchar NULL,
starttime varchar NULL,
endtime varchar null,
primary key reltype, from_product_id, to_product_id)
);

此外,我已经遍历@a_horse_with_no_name建议的门户。这是惊人的。我开始了解索引方面的许多新事物。

https://use-the-index-luke.com/