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

add_index :classifications, [:species, :family, :trivial_names]
add_index :classifications, :species
add_index :classifications, :family
add_index :classifications, :trivial_names

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

推荐答案

你正在比较一个综合指数和一组独立指数.它们只是不同而已.

可以这样想:复合索引可以在一组嵌套字段中快速查找第一个字段,然后快速查找第二个字段within ONLY the records already selected by the first field,然后快速查找第三个字段——同样,只在前两个索引 Select 的记录中.

让我们举个例子.在使用索引的if万条记录(如果内存可用)中,数据库引擎最多只需20个步骤就可以找到唯一值.无论你使用的是复合索引还是独立索引,这都是正确的——但只适用于第一个字段(在你的示例中是"物种",尽管我认为你需要家族、物种,然后是通用名称).

现在,假设第一个字段值有100000条匹配记录.如果只有一个索引,那么这些记录中的任何查找都将需要100000个步骤:第一个索引检索到的每个记录一个步骤.这是因为第二个索引将不被使用(在大多数数据库中——这有点简化),必须使用蛮力匹配.

如果你有一个composite index,那么你的搜索速度要快得多,因为你的第二个字段搜索将有一个索引within作为第一组值.在这种情况下,在字段1的composite index000个匹配中,只需不超过17个步骤就可以获得字段2的第一个匹配值(以10万为基数的日志(log)2).

因此:在一个包含1000000条记录的数据库中,需要使用3个嵌套字段上的复合索引来查找唯一记录,其中第一个字段检索100000条记录,第二个字段检索10000=20+17+14=51个步骤.

在相同条件下,仅独立指数=20+100000+10000=110020步所需的步骤.

差别很大吧?

现在,don't个疯狂的综合指数随处可见.首先,它们的插入和更新成本很高.其次,只有当您真正在嵌套数据之间进行搜索时,才会使用它们(例如,我在为给定日期范围内的客户端登录提取数据时使用它们).此外,如果您使用的是相对较小的数据集,那么它们也不值得.

最后,判断数据库文档.如今,数据库在部署索引方面已经变得极其复杂,我上面描述的Database 101场景可能在某些情况下并不适用(尽管我总是像这样开发,以便知道我得到了什么).

Ruby-on-rails相关问答推荐

如何测试自定义路由?

未捕获语法错误:try 编辑TRIX时,请求的模块未在Rails 7.1中提供名为默认的导出(在youtube.js:1:8)

有没有一种方法可以点击一个按钮来冒泡到父元素?

为什么没有生成命名空间路由?

Rails 使用多个外键创建/构建

Rails:当 id 方法为非标准时构建关联

在 Rails 3 中,如何在路由中使用锚点作为 ID?

来自控制台的 ActionCable.server.broadcast

有没有一种简单的方法可以让 pow 为 https 服务?

blueprint/screen.css 未预编译

如何判断是否已经在 ruby​​ on rails 的数据库事务中?

简单表单关联自定义标签名称

Rails - 获取没有 GET 参数的当前 url

带有查询字符串参数的 Rails 动作缓存

什么是Ruby 用于 BESIDES 轨道?

rails structure.sql和schema.rb有什么区别

导轨链接到:远程

Rails 4,Capistrano 3.0.0,无法加载这样的文件 - 部署

如何跳过失败的迁移? (耙分贝:迁移)

为什么 rails bootstrap 这么慢,我该怎么办?