我开始学习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操作。另外,请忽略表名或列名的大写字母。我才刚开始。
答案 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建议的门户。这是惊人的。我开始了解索引方面的许多新事物。