OR语句如何影响Postgres查询中的多列索引

时间:2017-11-14 23:58:46

标签: sql activerecord indexing

当用户注册(或作为访客订购)时,我目前正在postgres数据库中查询我的customers表,看看我们是否有任何旧记录可能与" new"用户。 用户还可以选择更改其名称。当他们这样做时,我们更改他们的主要名称,但在alt_fname和alt_lname字段中保留他们的旧名称。因此,我们的where子句(在ActiveRecord中)是

Customer.where(["(fname = :fname OR alt_fname = :fname) AND (lname = :lname OR alt_lname = :lname)", {fname: first_name, lname: last_name}])

为了加快速度,我想添加一些多列索引(例如在fname,lname上),但我不知道他们是否会在查询时使用它们并不简单和陈述,但两个OR由AND连接。

1 个答案:

答案 0 :(得分:0)

@GordonLinoff一般都是对的。

说过尝试添加2个排序索引lname,user_id和alt_lname,user_id。我不知道什么是postgres'优化器可以,但许多人会尝试通过索引检索,如果匹配率不好,可能会切换到顺序。如果你的基数很大,那么索引会有所帮助。

如果速度没有提高,请尝试使用lname的一个UNION和一个使用alt_lname的一个查询,并返回user_id。因为它不是一个联合ALL,所以仍然会有一个排序,但这应该只发生在结果集而不是整个表。