在ActiveRecord中,有两种方法可以声明多个列的索引:
add_index:分类,[:种,:家庭,:平凡名称] add_index:分类,:种类 add_index:classifications,:family add_index:分类,:平凡的名字
第一种方法和第二种方法之间有什么区别吗?如果是这样,我什么时候应该使用第一个,什么时候应该使用第二个?
您正在将复合索引与一组独立索引进行比较。他们只是不同。
可以这样考虑:复合索引使您可以快速查询嵌套字段集中 的第一个字段 ,然后 仅在第一个字段已选择的记录内 快速查询第二个 字段 ,然后快速查找再次,仅在前两个索引选择的记录内。
让我们举个例子。 如果 使用索引,数据库引擎将不超过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场景可能无法满足某些需求(尽管我总是像开发那样发展,所以我知道自己会得到什么)。