PostgreSQL
官方文档关于部分索引给了以下一个示例:
Example 11.2. Setting up a Partial Index to Exclude Uninteresting Values
If you have a table that contains both billed and unbilled orders, where the unbilled orders take up a small fraction of the total table and yet those are the most-accessed rows, you can improve performance by creating an index on just the unbilled rows. The command to create the index would look like this:
CREATE INDEX orders_unbilled_index ON orders (order_nr)
WHERE billed is not true;
A possible query to use this index would be:
SELECT * FROM orders WHERE billed is not true AND order_nr < 10000;
好奇针对未开票的订单,直接在 billed
字段上针对 not true
部分创建索引不是更好吗?
CREATE INDEX orders_unbilled_index ON orders (billed)
WHERE billed is not true;
官方示例却在 order_nr
字段上创建部分索引,这里是有什么讲究吗?求大佬指教 ~
已解决。
PostgreSQL 的部分索引可以放在任意列上,上面的示例仅仅是为了说明索引列和条件列不必一致,理论上,部分索引所在的列可以是任意列,只要查询的条件与部分索引的条件匹配,查询就可以走索引。
第一个索引根据order_nr字段,只包括billed为false的行,这个可以快速定位到没开票的订单的行,第二个是可以查所有没开票的订单,但是加上一些过滤条件的话可能性能没第一个好,取决于你的需求