postgres index:单列或多列。只有在哪里或在案件中

时间:2017-07-31 15:14:23

标签: sql postgresql indexing

我的主要查询是:

SELECT user_id 
FROM users 
WHERE status = 1 AND lang = %s AND inactive = 0 
ORDER BY 
    CASE WHEN location <> NULL THEN location <-> %s ELSE RANDOM () END LIMIT 1;

我在代码中执行的所有其他查询通常都是“user_id”,这是主键,所以我认为他们不需要特别关注索引。

在这种情况下,最好是在任何列中创建索引多列,如(status,lang,inactive)或索引,这样我就可以在索引中使用条件(status = 1,inactive = 0等)。

如果索引应该是多列,我还必须包含位置吗?

  • 位置以防万一,而不是
  • location已使用gist索引,因为它是地理列类型

此外,当lang和inactive不经常更新时,状态会不断更新,因为它表示用户可以与其他用户匹配的可用性。

该表没有索引,只有user_id上的主键。

总结一下:

  • 单列或多列索引是否更好?
  • 在多列的情况下,是否应该包含位置,因为它是以及不在哪里并且它使用gist索引?
  • 一般情况下,如果某个条件是在哪种情况而不是在哪里,是否使用索引并且有用?

1 个答案:

答案 0 :(得分:1)

此查询的最佳索引:

SELECT u.user_id
FROM users u
WHERE u.status = 1 AND lang = %s AND inactive = 0
ORDER BY CASE WHEN location <> NULL THEN location <-> %s ELSE RANDOM () END
LIMIT 1;

status, inactive, lang, location, user_id)的覆盖索引。但是,最后两列仅用于从索引中获取值。您的查询仍需要对order by进行排序。