sql - 如何优先考虑一个索引而不是另一个索引?

标签 sql postgresql indexing

我有以下代码:

SELECT * FROM table WHERE column1='value1' AND column2='value2';

我有一个 column1 索引和另一个 column2 索引。

我如何告诉 Postgres 更喜欢第二个索引?我应该把它放在第一位吗?

最佳答案

你不能直接告诉 Postgres 更喜欢哪个索引。除了罕见的极端情况之外,这也没有意义。

  • WHERE 子句中表达式的顺序完全无关。查询规划器将应用它认为合适的谓词。

  • 您不限于仅使用一个索引。 Postgres 可以同时使用两者,并将它们与位图索引扫描结合起来。 dba.SE 上相关答案的详细信息:

    但仅使用一个索引并过滤其余索引通常更有效。

  • 最后,您可以在列上创建单个多列索引,以优化性能。喜欢:

    CREATE INDEX foo ON tbl (column1, column2);
    

    甚至是partial index如果您的谓词之一是常量(大多数或所有查询都限制为 column2 = 'constant_value'),并且此选择远小于整个表:

    CREATE INDEX foo ON tbl (column1) WHERE column2 = 'constant_value';
    

如果 Postgres 对查询计划做出了错误的选择,那么您的数据库中通常会出现问题:

关于sql - 如何优先考虑一个索引而不是另一个索引?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26725731/

相关文章:

indexing - Neo4j 中可以接受混合类型索引吗?

mysql - 将 OHLC-Stockmarket 数据分组为多个时间范围 - Mysql

mysql - 需要多少个连接到枢轴才能获得不同的标签?

postgresql - 在psql中重命名数据库

postgresql - L.timeDimension 以 UTC 形式将时间发送到 GeoServer 而不是 iso8601

PHP 许多包含的文件

c# - 加参数后的SQL语句

mysql - 比较 now() 并返回最近的前一个日期和最近的下一个日期 SQL

database - 与 Postgres 安全的 TCP 连接?需要 SSL?

lucene - 选择 solr/lucene 提交策略