pg中多值列_postgresql – 多列索引和性能

回答

由于您参考网站use-the-index-luke.com,请考虑以下章节:

它有一个完美匹配你的情况的例子(双列索引,一个测试相等,另一个测试范围),解释(更多那些漂亮的索引图形)为什么@ypercube’s advice是准确的并总结起来:

Rule of thumb: index for equality first — then for ranges.

只有一列好吗?

对于只有一列的查询,该做什么似乎很清楚.关于这些相关问题的更多细节和基准:

选择性较低的列首先?

除此之外,如果两个列只有相同的条件怎么办?

没关系.把列放在第一位,更有可能获得自己的条件,这实际上很重要.

考虑这个演示,或自己重现.我创建了一个包含100k行的两列简单表.一个很少,另一个有很多不同的值:

CREATE TEMP TABLE t AS

SELECT (random() * 10000)::int AS lots,(random() * 4)::int AS few

FROM generate_series (1,100000);

DELETE FROM t WHERE random() > 0.9; -- create some dead tuples,more "real-life"

ANALYZE t;

SELECT count(distinct lots) -- 9999,count(distinct few) -- 5

FROM t;

查询:

SELECT *

FROM t

WHERE lots = 2345

AND few = 2;

EXPLAIN ANALYZE输出(排除缓存效果的最佳值为10):

Seq Scan on t (cost=0.00..5840.84 rows=2 width=8)

(actual time=5.646..15.535 rows=2 loops=1)

Filter: ((lots = 2345) AND (few = 2))

Buffers: local hit=443

Total runtime: 15.557 ms

添加索引,重新测试:

CREATE INDEX t_lf_idx ON t(lots,few);

Index Scan using t_lf_idx on t (cost=0.00..3.76 rows=2 width=8)

(actual time=0.008..0.011 rows=2 loops=1)

Index Cond: ((lots = 2345) AND (few = 2))

Buffers: local hit=4

Total runtime: 0.027 ms

添加其他索引,重新测试:

DROP INDEX t_lf_idx;

CREATE INDEX t_fl_idx ON t(few,lots);

Index Scan using t_fl_idx on t (cost=0.00..3.74 rows=2 width=8)

(actual time=0.007..0.011 rows=2 loops=1)

Index Cond: ((few = 2) AND (lots = 2345))

Buffers: local hit=4

Total runtime: 0.027 ms

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PostgreSQL是以加州大学伯克利分校计算机系开发的POSTGRES,现在已经更名为PostgreSQL. PostgreSQL支持大部分SQL标准并且提供了许多其它现代特性:复杂查询、外键、触发器、视图、事务完整性等。PostgreSQL 是一个免费的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如 MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL Server)之外的另一种选择。事实上, PostgreSQL 的特性覆盖了 SQL-2/SQL-92 和 SQL-3/SQL-99,首先,它包括了可以说是目前世界上最丰富的数据类型的支持,其中有些数据类型可以说连商业数据库都不具备, 比如 IP 类型和几何类型等;其次,PostgreSQL 是全功能的自由软件数据库,很长时间以来,PostgreSQL 是唯一支持事务、子查询、多版本并行控制系统(MVCC)、数据完整性检查等特性的唯一的一种自由软件的数据库管理系统。 Inprise 的 InterBase 以及SAP等厂商将其原先专有软件开放为自由软件之后才打破了这个唯一。最后,PostgreSQL拥有一支非常活跃的开发队伍,而且在许多黑客的努力下,PostgreSQL 的质量日益提高。从技术角度来讲,PostgreSQL 采用的是比较经典的C/S(client/server)结构,也就是一个客户端对应一个服务器端守护进程的模式,这个守护进程分析客户端来的查询请求,生成规划树,进行数据检索并最终把结果格式化输出后返回给客户端。为了便于客户端的程序的编写,由数据库服务器提供了统一的客户端 C 接口。而不同的客户端接口都是源自这个 C 接口,比如ODBC,JDBC,Python,Perl,Tcl,C/C++,ESQL等, 同时也要指出的是,PostgreSQL 对接口的支持也是非常丰富的,几乎支持所有类型的数据库客户端接口。这一点也可以说是 PostgreSQL 一大优点。本课程作为PostgreSQL数据库管理一,主要讲解以下内容: 1.     PostgreSQL 存储过程基本知识2.     PostgreSQL 用户自定义函数3.     PostgreSQL 控制结构4.     PostgreSQL 游标和存储过程5.     PostgreSQL 索引6.     PostgreSQL 视图7.     PostgreSQL 触发器8.     PostgreSQL 角色、备份和还原9.     PostgreSQL 表空间管理
PostgreSQL中,索引失效可能有多种原因。以下是一些常见的原因: 1. 索引重复:在同一上创建多个相同的索引可能会导致索引失效。这可能会导致性能问题,因为查询优化器可能会选择错误的索引。 2. 数据分布不均匀:如果索引的数据分布不均匀,即某些的频率很高,而其他的频率很低,那么索引可能会失效。这是因为查询优化器可能会认为使用索引不划算,而选择全表扫描。 3. 数据类型不匹配:如果查询中使用的数据类型与索引的数据类型不匹配,索引可能会失效。例如,如果索引是字符串类型,而查询中使用的是数字类型,那么索引将无法使用。 4. 查询条件不适合索引:如果查询条件不适合索引索引可能会失效。例如,如果查询中使用了函数、表达式或运算符,这些无法使用索引进行优化。 5. 索引过期或损坏:如果索引过期或损坏,它们可能会失效。在这种情况下,您可能需要重新创建索引。 以下是一个示例,演示了如何在PostgreSQL中创建索引以及可能导致索引失效的情况: ```sql -- 创建表 CREATE TABLE tb_l1 AS SELECT * FROM pg_class; -- 创建索引 CREATE INDEX idx_tb_l1 ON tb_l1 (oid); -- 创建重复索引(会导致性能问题) CREATE INDEX idx_tb_l1 ON tb_l1 (oid); -- 创建多个索引(可能导致性能问题) CREATE INDEX idx_tb_l1 ON tb_l1 (oid); CREATE INDEX idx_tb_l2 ON tb_l1 (oid); ``` 请注意,以上示例中的重复索引多个索引都可能导致性能问题和索引失效。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值