Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql postgres索引:单列或多列。仅在以下情况下_Sql_Postgresql_Indexing - Fatal编程技术网

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。前三列的顺序无关紧要,因为它们都是相等的。没有理由改变订单。