postgresql 对于我的用例,什么是正确的索引?我可以做得更好吗?

6g8kf2rb  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(2)|浏览(424)

如何为这个模式设置正确的索引?
我有一个产品表,我首先显示这样的活动产品:

SELECT name, price, categoryid FROM products WHERE status = 1;

然后一个人可以像价格一样过滤,然后我这样做:

SELECT name, price FROM products WHERE price > 100 AND status = 1;

但另一个想过滤喜欢的价格和类别,然后我这样做:

SELECT name, price, categoryid FROM products WHERE price > 100 AND categoryid = 4 AND status = 1

现在我如何设置正确的索引和非集群/过滤索引?
现在我这样做了:

CREATE INDEX I_PRODUCT_ACTIVE_NONC ON product(categoryid) WHERE status = 1;

然后我想当他想过滤两者时:

CREATE INDEX I_PRODUCT_ACTIVE_NONC_FILTER ON product(price, categoryid) WHERE status = 1;

但是当他只想过滤价格时,这是有效的:

CREATE INDEX I_PRODUCT_ACTIVE_NONC_FILTER ON product(price) WHERE status = 1;

那么我应该为这个例子创建多少个索引,有很多过滤索引是可以的,或者是不好的?因为我有ohter列,如颜色和大小,这已经被索引了。
任何Maven可以帮助我应该做什么?

3mpgtkmj

3mpgtkmj1#

使用PostgreSQL,您可以创建和使用multi-column indexes。顺序通常很重要,您通常希望在具有 equality 比较的列之前(以及在未使用的列之前)有 equality 比较的列。
多列B树索引可以与涉及索引列的任何子集的查询条件一起使用,但是当对前导(最左边)列有约束时,索引是最有效的。确切的规则是,前导列上的等式约束,加上第一列上没有等式约束的任何不等式约束,将用于限制扫描的索引部分。
对于这样的查询:

SELECT name, price, categoryid FROM products
    WHERE price > 100 AND categoryid = 4 AND status = 1

索引products(status, categoryid, price)将比product(status, price, categoryid)上的索引更好地工作。
或者,如果您总是使用status=1,则可以使用CREATE INDEX ON products(categoryid, price) WHERE status=1
对于这个查询,不太可能使用products(categoryid, price) WHERE status=1上的索引:

SELECT name, price FROM products
WHERE price > 100 AND status = 1

在这种情况下,可能需要在products(price) WHERE status=1(或products(status, price))上创建另一个索引。
请记住在创建索引之后运行ANALYZE,以便计划者在选择使用哪些索引之前可以做出更好的估计。
您可以看到使用EXPLAIN ANALYZE的情况。这应该显示使用的内容。

EXPLAIN ANALYZE
    SELECT name, price, categoryid FROM products
    WHERE price > 100 AND categoryid = 4 AND status = 1

如果创建了多个索引,则值为checking their usage statistics。(不必创建太多无用的索引,因为它可能会使计划者感到困惑。

czq61nw1

czq61nw12#

快速地说,聚集索引应该总是在主键(PK)上。至于其他的,这取决于你的音量和表现。请记住,值的多样性越大,索引的效率就越高。

相关问题