我的表格(user_tran
)有3个字段" user_id "," transaction_id ",& #34;的 TIME_STAMP "
我哈希索引user_id
和transaction_id
(因为我需要完全匹配)和time_stamp
上的b +树索引
查询
select user_id from user_tran where transaction_id = 1 and time_stamp > now() - 3 days;
select transaction_id from user_tran where user_id = 1 and time_stamp > now() - 3 days;
有谁知道这个查询的复杂性是什么?我知道如果我们只是按哈希索引列过滤,它将是 o(1),而b + tree给出 o(lgn)。但是将它们组合在一起呢?
那会是 o(lgn + 1)吗?
另外,如何将表存放在引擎盖下。 DBMS会同时维护3个索引(2个哈希和1个b +树)吗?
用Google搜索了一下,但没有找到答案。
答案 0 :(得分:1)
使用这样的三个索引,使用索引的查询的复杂性将是 O(n),因为组合多个索引的唯一方法是位图和 。创建位图需要读取整个索引,即 O(n)。
因此,除非单独的条件都没有选择性,否则我假设PostgreSQL会选择对最具选择性的索引进行常规索引扫描,并使用其他条件作为过滤器。此类查询的复杂性与匹配索引条件的行的百分比成比例(例如,如果只有user_id = 1
的常量行数,则 O(1),而不管表格大小)。
这些查询的理想索引是:
CREATE INDEX ON user_tran (transaction_id, time_stamp);
CREATE INDEX ON user_tran (user_id, time_stamp);