Rails中的多列索引顺序

时间:2015-08-12 15:06:45

标签: ruby-on-rails database-design indexing

我理解为什么索引顺序在Rails中很重要(来自答案like these),例如,如果我有:

add_index :admin_users_pages, ["user_id", "page_id"]

所以我应该把字段缩小行数"最快,但我不确定这是什么意思。假设我有2个用户,有2个唯一ID,300个页面,有300个唯一ID,哪一个更聪明的选择?假设第一个用户有150页,第二个用户有150页,索引看起来像是:

user_id page_id
1       1
1       2  
1       3

或者page_id根本没有排序,只有索引,所以我应该得到类似的东西:

user_id page_id
1       143
1       93  
1       31

2 个答案:

答案 0 :(得分:1)

在你的情况下,page_id的选择性会更好,因为它会极快地缩小行数(减少到2)。这意味着,如果您获得page_id,则可以从表中获取2条记录,然后按user_id过滤它们,但如果您有user_id,那么您将获取150条记录并过滤他们。所以最好先放上'page_id'。

答案 1 :(得分:1)

如果要为给定用户找到其页面,请使用[:user_id,:page_id]。

如果您要查找给定页面的用户,请使用[:page_id,:user_id]。

如果要同时执行这两项操作,请创建[:user_id,:page_id]和[:page_id,:user_id]。

如果你有一个user_id和一个page_id,并且你想找到那一行(不是很可能的情况,恕我直言),那么对于一个平衡的树索引,你所选择的顺序并不重要。条目在第一列和第二列以及后续列的索引中排序。

在某些情况下,最有选择性的应该是第一个(对于Oracle压缩的b树索引或Oracle跳过扫描访问),但总的来说它确实无关紧要。