Sql postgres索引:单列或多列。仅在以下情况下
我的主要问题是:Sql postgres索引:单列或多列。仅在以下情况下,sql,postgresql,indexing,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,这是主键,所以我认为它们不需要特别注意索引 在这种情况下,最好在任何列
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或一个索引,这样我就可以在index status=1、inactive=0等中使用一个条件
如果索引应该是多列的,我还必须包括位置吗
位置是以防万一,而不是在哪里
location已使用摘要索引,因为它是地理列类型
另外,虽然lang和inactive不经常更新,但status in continuously也会更新,因为它表示用户可以与另一个用户进行匹配
该表没有索引,只有用户id上的主键
综上所述:
单列索引还是多列索引更好?
如果是多列,位置是否应该包括在内,因为它是在case中,而不是在where中,并且它可以使用一个要点索引?
一般来说,如果条件是in-case而不是where,索引是否已使用且有用?
此查询的最佳索引:
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;
是状态、非活动、语言、位置、用户id的覆盖索引。但是,最后两列仅用于从索引中获取值。您的查询仍然需要对order by进行排序。因此,尽管已经使用gist创建了索引,但我还包括了location?如果它是一个列主键,我不明白为什么还要包括user_id。Thanks@user8372336 . . . 它可能不需要,但我想把它包含在显式中。请问您为什么在查询中使用where status、lang、inactive,以及按索引顺序使用inactive stauts、inactive、lang、location、user_id反转lang。索引是否仍然有效?@user8372336。前三列的顺序无关紧要,因为它们都是相等的。没有理由改变订单。