连接表的最佳 SQL 索引

2024-04-16

考虑到性能改进,我想知道哪些索引对连接表(特别是在 Rails 3 has_and_belongs_to_many 上下文中使用)是否有帮助以及哪些索引有帮助。

模型和表格设置

我的模型是Foo and Bar根据 Rails 约定,我有一个名为bars_foos。没有主键或时间戳使得该表中的旧字段bar_id:integer and foo_id:integer。我有兴趣知道以下哪个索引最好并且没有重复:

  1. 复合索引:add_index :bars_foos, [:bar_id, :foo_id]
    • 两个指标
    • A. add_index :bars_foos, :bar_id
    • B. add_index :bars_foos, :foo_id
  2. 1 和 2-B 的组合

基本上,我不确定复合索引是否足够,假设它一开始就有帮助。我相信复合索引可以用作第一项的单个索引,这就是我的原因pretty确保使用所有三行肯定会导致不必要的重复。

可能的用途

最常见的用法将给出模型的实例Foo,我会询问其相关的bars使用 RoR 语法foo.bars反之亦然bar.foos对于模型的一个实例Bar.

这些将生成以下类型的查询SELECT * FROM bars_foos WHERE foo_id = ? and SELECT * FROM bars_foos WHERE bar_id = ?分别然后使用这些结果 ID 来SELECT * FROM bars WHERE ID in (?) and SELECT * FROM foos WHERE ID in (?).

如果我不正确,请在评论中纠正我,但我不相信,在 Rails 应用程序的上下文中,它会尝试执行指定两个 ID 的查询,例如SELECT * FROM bars_foos where bar_id = ? AND foo_id = ?.

数据库

如果有特定于数据库的优化技术,我很可能会使用 PostgreSQL。然而,其他使用此代码的人可能希望在 MySQL 或 SQLite 中使用它,具体取决于他们的 Rails 配置,因此我们感谢所有答案。


答案

经常重复的答案往往是“这取决于情况”。更具体地说,这取决于您的数据是什么以及如何使用这些数据。

tl;dr 解释

针对我的具体案例(并涵盖所有未来基础)的简短 tl;dr 答案是选择#2这正是我所怀疑的。但是,选择 #3 效果很好,因为根据我对数据的使用情况,创建复合索引所使用的额外时间和空间可能会减少未来的查询查找。

完整的解释

原因是数据库试图变得智能,并尝试尽可能快地完成任务,而不管程序员的输入如何。添加索引时要考虑的最基本的事项是该对象是否可以通过该键查找。如果是,索引可能有助于加快速度。然而,是否使用该索引都取决于字段的选择性和基数。

由于外键通常是另一个 AR 类的 ID,因此基数通常会很高。但同样,这取决于您的数据。在我的例子中,如果有很多Foo但很少Bars,我的连接表中的许多条目都会有类似的bar_ids. With bar_ids 的基数较低,索引为bar_id可能永远不会被使用,并且可能会妨碍数据库在每次新索引时投入时间和资源*来添加到此索引bars_foos条目已创建。许多人也是如此Bar和少数Foos 并且两者都很少。

一般的教训是,在考虑表上的索引时,确定是否将通过该字段查找条目以及该字段是否具有高基数。也就是说,这个字段是否有许多不同的值?对于大多数连接表来说,“这取决于”,我们必须更仔细地考虑数据表示的内容以及关系本身。就我而言,我将有both many Foos and Bars并将抬头Foos 由其相关的bars,反之亦然。

我在办公室得到的另一个很好的答案是,“你为什么担心你的索引?构建你的应用程序!”

脚注

* 在类似的问题中关于 STI 指数 https://stackoverflow.com/questions/33486907/will-a-compound-index-with-a-second-column-of-low-cardinality-effect-performance#answer-33973140有人指出,索引的成本非常低,因此当有疑问时,只需添加它即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

连接表的最佳 SQL 索引 的相关文章

  • Bundler 似乎无法通过 Rbenv 找到正确的 Ruby

    多年来我一直使用 RVM 作为 Ruby 版本管理器 但由于其简单性 我想改用 rbenv 但是我在部署时发现了一些奇怪的问题 这似乎是错误的地方 env RBENV ROOT home deploy rbenv PATH home dep
  • Paperclip 会自动清理文件名吗?

    我正在使用 Thoughtbot回形针宝石 https github com thoughtbot paperclip处理文件上传 我发现当我上传文件名中包含空格的文件时 它会用下划线替换空格来存储 那挺好的 我还尝试上传带有特殊字符的文件
  • 在 Ruby on Rails 中渲染部分集合正在乘以项目

    我想在 Ruby on Rails 的页面中显示项目列表 我使用部分 in my index html erb我有的文件 in list news html erb I have div class news div
  • env 配置文件中未初始化的常量 ActiveSupport::EventedFileUpdateChecker

    我是 Ruby on Rails 的新手 运行 捆绑 命令进行更新 安装后 当我尝试执行以下操作时rails s or rails g mongoid config控制台返回以下消息开头 home myUser proyect config
  • 在 django 中创建“历史”类型模型的最佳方法是什么?

    我想为我的 Django 应用程序创建一个类似于 Django 管理员的 最近操作 的功能 以便存储其他模型的历史信息 例如 假设我有两个模型 分别称为 Book 和 Author 我想要第三个模型来存储信息 例如由谁以及何时对模型中的给定
  • Rails 3 公司帐户具有许多用户,限制对数据的访问

    我想知道在我的应用程序中构建身份验证 授权的最佳方法 我希望有 许多公司帐户 可能使用子域 帐户有很多用户 用户只能访问自己或具有相同帐户的其他用户创建的记录 我所做的研究提供了许多混合搭配的想法 以奇怪而美妙的方式组合 devise ca
  • Rails 应用程序中的持久 TCP 连接

    我有一个在服务器上运行的第三方应用程序 它对客户端进行身份验证并返回响应 我的问题是 对于我收到 Rails 应用程序的每个请求 我都需要建立 TCP 连接并获取数据 是否可以有一个持久连接 以便我可以减少建立连接的开销 我希望你使用的是
  • 通过 has_many 进行多个数据库连接

    如何通过使用多个数据库连接来创建 has many 我有一个名为 master 的数据库 其中保存位置信息 这是从单独的应用程序更新的 用户可以访问许多位置 但所有其他模型都位于另一个名为 budget 的数据库中 以下是模型的设置方式 p
  • Rails:从视图内渲染视图(不是部分视图)

    我有一个对两者都有响应的控制器html and js The htmlview 渲染整个页面 包括页眉和页脚 而js仅替换 main 除了页眉和页脚之外 两种格式呈现相同的内容 我可以用三个文件获得这种效果 show html erb di
  • blueprint/screen.css 未预编译

    我一直在遵循 Michael Hartl 出色的 RoR 教程 但我使用的是 RoR 3 1 我是 RoR 3 1 的新手 需要与资产管道相关的帮助 这是我的问题 在继续第 5 3 节之前 我想先转到 Heroku 看看事情如何发展 令我惊
  • 为什么 .each 在我的 Rails 视图中完成后会重复数组? [复制]

    这个问题在这里已经有答案了 在我的 Rails 视图页面中 我有以下循环 它应该循环遍历我的 tag list 数组并打印每个标签 由于某种原因 它在打印每个单独的标签后会重复该数组 例如 这个数组有两个元素 ruby python 每个方
  • 尝试从 Rails 控制器调用辅助方法时出现 NoMethodError

    我得到了一个NoMethodError当尝试从我的控制器类之一访问我的帮助器模块之一中定义的方法时 我的 Rails 应用程序使用helper类方法与 all符号如下图所示 class ApplicationController lt Ac
  • Mongoid 4 / MongoDB 2.4+“冻结”问题

    自从使用 Mongoid 维护与 mongodb 的连接以来 我遇到了一个奇怪的问题 我认为这最初是由于升级到 Rails 4 0 需要更新 Mongoid Moped 但我在其他基于 Rack 的应用程序 具体来说是 Sinatra 和
  • 寻找多列索引的最佳顺序

    假设我有一个包含两个索引的表 一个位于 a 列 一个位于 a b 和 c 列 我注意到 根据索引定义中列的顺序 MySQL 可能最终使用单列索引而不是多列索引 即使多列索引中的所有三列都在 ON 中引用JOIN 的一部分 这有点引出了一个问
  • ruby on Rails id 不保存

    我知道这违反了 ruby on Rails 约定 但我的这个表的 id 不需要自动递增 我是通过逻辑设置它的 但是 它不会保存到数据库 保存的所有内容都将保存为 id 的空值 def self up create table probes
  • 使用 RSpec 请求规范授权请求时,access_token 无效

    我正在尝试测试CredentialsController 使用 RSpec 请求规范在生产中运行良好 Code 控制器 class CredentialsController lt ApplicationController before
  • 如何将openId与rails 3中的设备集成

    我是 Rails 新手 刚刚完成了一个简单的设计设置 我正在寻求实现一些仍然使用核心设计功能集但允许通过 openid 提供商登录而不是 使用电子邮件或用户名注册 的东西 我如何开始使用最新的设计宝石和rails 3 看看devise op
  • 仅适用于安全页面的安全回形针 URL

    我正在尝试找到使回形针网址安全的最佳方法 但仅限于安全页面 例如 显示存储在 S3 中的图像的主页是http mydomain com http mydomain com图像网址是http s3 amazonaws com mydomain
  • 使用 prawnto_2 gem 加载图像时,RAILS_ROOT 不再有效

    我正在将我的应用程序从 Rails 3 0 升级到 Rails 3 1 我已经尽可能地将旧插件转为 gems 其中包括用这个漂亮闪亮的新插件替换旧的 prawnto 插件对虾 2 https github com forrest prawn
  • 如何使用回形针对多页 pdf 进行缩略图

    我想让 Paperclip 为上传的多页 PDF 文件的每一页创建 2 个缩略图 我正在运行 Paperclip 2 3 1 1 并在我的资产模型中使用它 has attached file asset styles gt medium g

随机推荐

  • 是否可以使用多处理对一个 h5py 文件进行并行读取?

    我正在尝试加快从 h5py 数据集文件中读取块 将它们加载到 RAM 内存中 的过程 现在我尝试通过多处理库来做到这一点 pool mp Pool NUM PROCESSES gen pool imap loader indices 加载器
  • 在 Mac OS X 中获取进程创建通知

    我正在尝试为 Mac OS X 编写 kext 当任何进程启动时都会收到通知 在 Windows 中 您可以通过调用 PsSetLoadImageNotifyRoutine 并指定在进程启动时调用的回调来完成此操作 这是有记录的方式 它适用
  • 如何处理大型 csv 文件或分块读取大型 CSV 文件

    我有非常大的 csv 文件 我正在尝试迭代它们 我正在使用 opencsv 我想使用 CsvToBean 以便我可以动态设置数据库中的列映射 我的问题是如何在不获取整个文件并将其放入列表中的情况下执行此操作 我正在努力防止记忆错误 我目前正
  • 在服务器端渲染的反应项目中使用标头时,出现“ReferenceError:标头未定义”

    我正在 React 中设置一个新应用程序 我希望它在服务器端呈现 不幸的是我无法使用Headers https developer mozilla org en US docs Web API Headers因为它不断抛出错误 Refere
  • Calendar.getTime() 中奇怪的 IllegalArgumentException

    这个非常简单的测试失败了IllegalArgumentException HOUR OF DAY 2 gt 3 我看不出有什么理由 您可以将任何小时 天 月 年更改为任何其他值 测试就会成功 我测试过的任何 JRE 均失败 似乎是 Greg
  • 我收到错误“CharField 不支持查找‘图标’或不允许加入该字段。”

    我正在尝试进行动态查询来获取数据 如下所示 query request GET get q kwargs 0 1 format first name icontains query if query players list players
  • Spring Data Rest / Spring Hateoas 自定义控制器 - PersistentEntityResourceAssembler

    我正在尝试向 RepositoryRestResource 自动生成的端点添加一些额外的业务逻辑 请看下面的代码 资源 RepositoryRestResource collectionResourceRel event path even
  • python os.fdopen(os.open()) 不能用于写入?

    这个问题与答案有关在Python中写入具有特定权限的文件 https stackoverflow com questions 5624359 write file with specific permissions in python用于打
  • 在gerrit中使用OpenID注册失败

    这些天我正在尝试设置 gerrit 但是当涉及到使用 OpenID 注册时 总是出现一个问题 提供商不受支持 或者输入错误 我在上面看到了同样的问题OpenID 与 Gerrit 不工作 https stackoverflow com qu
  • IntelliJ 中的 Gradle SourceSet 依赖项

    我有一个带有附加源集的 Gradle 项目 acceptance 这包含我的验收测试 而不仅仅是构建时单元和集成测试 我在标准中还有一些辅助类test我想分享的源集 但它不属于main源集 目前这在 Gradle 中运行良好 但 Intel
  • 用于与 TCP 套接字对话的 Cocoa-Touch 框架? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我有一个守护程序在锁定到 TCP IP 端口的服务器上运行 我正在寻找当前是否有任何支持 iPhone
  • php中如何去除标点符号

    除了这些字符之外 如何删除标点符号 这是一个巧妙的方法 preg replace punct target
  • 为多个页面编写一次 Twitter Bootstrap 导航栏

    我正在尝试开始使用 Twitter Bootstrap 3 我想让每个导航栏项目都转到新的 href 例如 我希望导航栏项目 关于 和 联系 链接到对应的about html and contact html pages 我发现的许多网站似
  • 输入时自动完成,使内容跳转

    我有一个输入 在 Chrome 中 当弹出自动完成菜单并且您将鼠标悬停在其中一个选项上时 输入下方的内容会跳转 就像自动完成选择由于某种原因添加垂直填充一样 我怎样才能阻止这个 这很烦人 这是一个例子 小提琴演示 https jsfiddl
  • 如何使用扩展功能保存分层图像

    我正在使用扩展函数将 uiview 保存为 uiimage 该代码用于保存 uiimage 然而 我想做的是在保存到照片库的图像上保存透明图像 所以我尝试使用扩展函数保存分层图像 现在只有 uiivew 被保存 第二层没有被保存 class
  • Web API 返回 csv 文件

    我需要从 Web API 控制器获取 csv 文件 我无法显示 另存为 对话框 页面上仅显示文本输出 我尝试了两者 从 jquery 调用 Export 以及普通的旧 html 控制器 System Web Http HttpGet pub
  • 溢出-y:滚动在 Firefox 中不起作用

    请参考网址 http jsfiddle net 8tFnG 1 http jsfiddle net 8tFnG 1 table border 1 cellspacing 0 cellpadding 1 width 100 table
  • 获取任何给定字符的宽度(以像素为单位)

    我有一个非常棒的想法 但无法找出 NET Framework 中是否有任何类 任何版本 最好是 3 5 或 4 0 允许您传入字符 并获取该字符的宽度 以像素为单位 无论使用哪种字体 字体大小或字体装饰 有人可以指出我正确的方向吗 像这样的
  • 使用JS显示计算结果的HTML输出

    我正在尝试使用 HTML 和 JS 构建一个卡路里计算器 目前正在努力在屏幕上 或通过 console log 显示输出 我知道我正在做一些非常基本的错误 但目前无法确定那是什么 下面是我的 HTML 和 JS 代码 document ge
  • 连接表的最佳 SQL 索引

    考虑到性能改进 我想知道哪些索引对连接表 特别是在 Rails 3 has and belongs to many 上下文中使用 是否有帮助以及哪些索引有帮助 模型和表格设置 我的模型是Foo and Bar根据 Rails 约定 我有一个