以前,我问过这个关于 ActiveRecord 中多态外键的复合索引的问题。我的问题的基础是我理解索引应该基于列的基数,并且 Rails 的 STI 类型和多态 _type 列的基数通常很低。
接受我的问题的答案是正确的——这就是索引高基数 _id 列和低基数 _type 列的价值,因为它们在一起具有高基数——我的下一个问题是:你应该如何订购你的化合物索引?
[owner_id, owner_type] 的索引将具有较高基数的字段放在第一位,而 [owner_type, owner_id] 将具有较高基数的字段放在第二位。使用前一个键的查询比使用后一个键的查询性能更高,还是它们的性能相同?
我问是因为这与我如何为服务 STI 模型的表订购复合键有特殊关系。STI Rails 查找器几乎总是在类型列上进行查询——这又是一个通常低基数的列。因此,类型列的查询比其他索引更频繁。如果更频繁地查询类型列,那么使用类型前导索引可能是有意义的,因为不太具体的查询可以利用索引的第一部分来提高性能。但是,我不会因为不利于高度特定查询的性能而降低福利。利用索引的较高基数部分。