sql - ActiveRecord 中多列的索引

标签 sql ruby-on-rails activerecord indexing

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

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

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

最佳答案

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

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

举个例子。 如果您使用索引,您的数据库引擎将采取不超过 20 个步骤来在 1,000,000 条记录(如果没记错的话)中定位唯一值。无论您使用复合索引还是独立索引,这都是正确的 - 但仅适用于第一个字段(示例中的“物种”,尽管我认为您需要“家族”、“物种”,然后是“通用名称”)。

现在,假设第一个字段值有 100,000 条匹配记录。如果您只有单个索引,那么这些记录中的任何查找都将执行 100,000 步:第一个索引检索的每条记录都需要执行 100,000 步。这是因为不会使用第二个索引(在大多数数据库中 - 这有点简化)并且必须使用强力匹配。

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

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

相同条件下仅使用独立索引所需的步数 = 20 + 100,000 + 10,000 = 110,020 步。

差别很大吧?

现在,不要疯狂地将综合指数到处放置。首先,它们的插入和更新成本很高。其次,只有当您真正在嵌套数据中搜索时,它们才会发挥作用(另一个例子,我在提取给定日期范围内客户端登录的数据时使用它们)。此外,如果您使用相对较小的数据集,那么它们就不值得。

最后,检查您的数据库文档。如今,数据库在部署索引的能力方面已经变得极其复杂,我上面描述的数据库 101 场景可能不适用于某些人(尽管我总是开发得好像它确实如此,这样我就知道我会得到什么)。

关于sql - ActiveRecord 中多列的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1048909/

相关文章:

ruby-on-rails - 什么是 Rack 中间件?

ruby-on-rails - Ruby on Rails 协会

java - 在 querydsl 中选择每组最大的元素

sql - 这个 SQL IF 对 & 符做了什么?

ruby-on-rails - rails : activating SSL support gets Chrome confused

ruby-on-rails - rspec 中的模拟 Controller 方法

ruby-on-rails - 属于 :class_name option fails

ruby-on-rails - 如何检查 ActiveRecord inverse_of 检测是否有效?

SQL 查询、通配符、MS SQL SERVER 2005

php - 在 Web 服务器上存储和检索图像的最佳方法是什么?