sql - 如何找到需要索引的列?

标签 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 操作。另外请忽略表名或列名的大写字母。我才刚刚开始。

最佳答案

理想的是两个索引:

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,则不需要我建议的第一个索引。

为什么顺序很重要?想象一下,您正在图书馆中查找一本书,其中的书籍按“姓氏、名字”排序。您可以使用此顺序快速查找“Dickens”的所有书籍,但不是任何“Charles”的所有书籍。

但让我也对您的疑问发表评论。

如果有很多不同的 reltype 值,第一个会表现很差;在这种情况下尝试提高 work_mem。它总是对整个表进行顺序扫描,没有索引可以提供帮助。

关于sql - 如何找到需要索引的列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54793897/

相关文章:

java - Java Web 应用程序的性能测试

php - Woocommerce 中当前用户按产品划分的总购买次数

django - pgbouncer - 关闭因为 : unclean server on every connection

Erlang 中的 Postgresql 连接池

python - 如何使用日期索引和多级列进行切片 (MultiIndex)

mysql - 在表格中间拖动一些行

PHP foreach 不工作

mysql - 如何组合两个 SQL 查询,使一个查询的输出成为另一个查询的条件

MySQL 索引 - 根据此表和查询的最佳实践是什么

python - 更新多重索引 np.array 中的元素