一尘不染

ActiveRecord中多列的索引

sql

在ActiveRecord中,有两种方法可以声明多个列的索引:

add_index:分类,[:种,:家庭,:平凡名称]


add_index:分类,:种类
add_index:classifications,:family
add_index:分类,:平凡的名字

第一种方法和第二种方法之间有什么区别吗?如果是这样,我什么时候应该使用第一个,什么时候应该使用第二个?


阅读 127

收藏
2021-03-17

共1个答案

一尘不染

您正在将复合索引与一组独立索引进行比较。他们只是不同。

可以这样考虑:复合索引使您可以快速查询嵌套字段集中 的第一个字段 ,然后 仅在第一个字段已选择的记录内 快速查询第二个 字段
,然后快速查找再次,仅在前两个索引选择的记录内。

让我们举个例子。 如果
使用索引,数据库引擎将不超过20个步骤来在1,000,000条记录(如果有内存)中定位唯一值。不管您使用的是复合索引还是独立索引,这都是正确的-
但仅适用于第一个字段(示例中为“ species”,尽管我认为您需要Family,Species,然后是Common Name)。

现在,假设此第一个字段值有100,000个匹配记录。如果您只有一个索引,则这些记录中的任何查找将采取100,000个步骤:第一个索引检索到的每个记录都将执行一个步骤。这是因为将不使用第二个索引(在大多数数据库中,这有点简化),必须使用蛮力匹配。

如果您有一个 复合索引, 那么您的搜索会更快,因为第二个字段搜索将
第一组值中包含一个索引。在这种情况下,您只需不超过17个步骤,即可在字段1的100,000个匹配项(100,000个对数的对数)中获得字段2的第一个匹配值。

因此:在3个嵌套字段上使用复合索引从1,000,000条记录的数据库中查找唯一记录所需的步骤,其中第一个检索100,000,第二个检索10,000 = 20
+ 17 + 14 = 51个步骤。

在相同条件下仅具有独立索引所需的步骤= 20 + 100,000 + 10,000 = 110,020个步骤。

有很大的不同,是吗?

现在, 不要
胡乱把复合索引放到任何地方。首先,它们在插入和更新上很昂贵。其次,只有当您真正在嵌套数据中搜索时,它们才会发挥作用(例如,在给定日期范围内为客户端的登录获取数据时,我会使用它们)。此外,如果您使用的数据集相对较小,那么它们也不值得。

最后,检查您的数据库文档。这些天来,数据库在部署索引方面的能力已经变得极为复杂,并且我上面描述的Database
101场景可能无法满足某些需求(尽管我总是像开发那样发展,所以我知道自己会得到什么)。

2021-03-17