【问题标题】:Does the index column order matter on row insert in Postgresql?索引列顺序对 Postgresql 中的行插入是否重要?
【发布时间】:2021-08-10 11:46:53
【问题描述】:

我有一张和这张类似的桌子:

create table request_journal
(
    id                  bigint,
    request_body        text,
    request_date        timestamp,
    user_id             bigint,
);

它用于请求记录目的,因此预计会频繁插入(2k+ rps)。 我想在 request_date 和 user_id 列上创建复合索引,以加快执行这样的选择查询:

select * 
from request_journal 
where request_date between '2021-07-08 10:00:00' and '2021-07-08 16:00:00'
  and user_id = 123
order by request_date desc;

我使用 (request_date desc, user_id) btree 索引和 (user_id, request_date desc) btree 索引测试了选择查询。使用 request_date 前导列索引选择查询的执行速度大约快 10%,但一般来说,任何此类索引的性能都是可以接受的。

所以我的问题是索引列顺序会影响插入时间吗?我没有发现在插入查询中使用 EXPLAIN/EXPLAIN ANALYZE 的任何差异。在“高负载”下,哪个索引的构建时间效率更高?

【问题讨论】:

  • 我无法回答您关于 INSERT 性能的问题,但您应该使用 multicolumn index 中最左侧位置最具选择性的列。在您的情况下,这肯定是request_date 列。
  • 我很确定两个索引之间的 INSERT 时间不会有任何可测量的差异(假设您只保留其中一个)。一种加快插入速度的方法可能是按月或按年分区。

标签: postgresql postgresql-11


【解决方案1】:

很难相信您的测试是在任何模糊现实的数据大小上完成的。

按照您指定的速度,6 小时范围内将包含超过 4300 万条记录。如果 user_ids 均匀分布在 1e6 个不同的值上,我得到以 user_id 开头的索引比以 request_date 开头的索引快一千倍。

但是无论如何,对于加载新数据,假设新数据都是最近的,那么带有request_date的应该会更快,因为需要维护的索引部分,而加载会更集中在索引部分,并且所以更好地缓存。但这取决于您有多少 RAM、您的磁盘系统是什么样的,以及您正在为多少个不同的 user_id 加载数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-06-01
    • 2014-08-10
    • 1970-01-01
    • 2017-12-19
    • 2020-09-15
    • 1970-01-01
    • 2020-07-30
    • 2015-04-13
    相关资源
    最近更新 更多