代码之家  ›  专栏  ›  技术社区  ›  Ray Zhang

PostgreSQL:哪个索引顺序更好?

  •  0
  • Ray Zhang  · 技术社区  · 7 年前

    SELECT id, pair_time, user1, user2 
    FROM pairs 
    WHERE ? in (user1, user2) 
    ORDER by pair_time
    

    ? = 在运行时指定的任意用户名。

    CREATE INDEX ON pairs (user1, pair_time)
    CREATE INDEX ON pairs (user2, pair_time)
    

    但是否应该颠倒顺序?

    CREATE INDEX ON pairs (pair_time, user1) 
    CREATE INDEX ON pairs (pair_time, user2) 
    

    1 回复  |  直到 7 年前
        1
  •  1
  •   Gordon Linoff    7 年前

    我不知道Postgres是否会在这个查询中明智地使用这些索引。

    SELECT u.*
    FROM ((SELECT id, pair_time, user1, user2
           FROM pairs
           WHERE user1 = ?
          ) UNION ALL
          (SELECT id, pair_time, user1, user2
           FROM pairs
           WHERE user2 = ?
          )
         ) u
    ORDER by pair_time;
    

    这将在上使用索引 pairs(user1) pairs(user2) 对于每个子查询。外层 order by

        2
  •  1
  •   a_horse_with_no_name    7 年前

    另一种选择是使用 GIN index

    create index on pairs using gin ((array[user1, user2]) array_ops);
    

    然后将查询更改为使用比较数组:

    select id, pair_time, user1, user2 
    from pairs
    where array[user1, user2] && array[1234]
    order by pair_time
    
        3
  •  0
  •   Zaynul Abadin Tuhin    7 年前

    SELECT id, pair_time, user1, user2 FROM pairs WHERE ? in (user1, user2) ORDER by pair_time
    

    下面的索引将比您创建的其他2个索引更有帮助

    CREATE INDEX ON user_pairs (user1, pair_time)
    CREATE INDEX ON user_pairs (user2, pair_time)