我的主要查询是:
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等)。
如果索引应该是多列,我还必须包含位置吗?
此外,当lang和inactive不经常更新时,状态会不断更新,因为它表示用户可以与其他用户匹配的可用性。
该表没有索引,只有user_id上的主键。
总结一下:
答案 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
进行排序。