如何为这个模式设置正确的索引?
我有一个产品表,我首先显示这样的活动产品:
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可以帮助我应该做什么?
2条答案
按热度按时间3mpgtkmj1#
使用PostgreSQL,您可以创建和使用multi-column indexes。顺序通常很重要,您通常希望在具有 equality 比较的列之前(以及在未使用的列之前)有 equality 比较的列。
多列B树索引可以与涉及索引列的任何子集的查询条件一起使用,但是当对前导(最左边)列有约束时,索引是最有效的。确切的规则是,前导列上的等式约束,加上第一列上没有等式约束的任何不等式约束,将用于限制扫描的索引部分。
对于这样的查询:
索引
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
上的索引:在这种情况下,可能需要在
products(price) WHERE status=1
(或products(status, price)
)上创建另一个索引。请记住在创建索引之后运行
ANALYZE
,以便计划者在选择使用哪些索引之前可以做出更好的估计。您可以看到使用
EXPLAIN ANALYZE
的情况。这应该显示使用的内容。如果创建了多个索引,则值为checking their usage statistics。(不必创建太多无用的索引,因为它可能会使计划者感到困惑。
czq61nw12#
快速地说,聚集索引应该总是在主键(PK)上。至于其他的,这取决于你的音量和表现。请记住,值的多样性越大,索引的效率就越高。