连接表的最佳 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 索引 的相关文章

  • Id 或 [TableName]Id 作为主键/实体标识符

    是否首选使用 Id 作为主键的列名或 TableName Id 作为命名约定 表 账户主键 ID 相对 表 账户主键 AccountId 在我见过的实现中 它似乎分为 50 50 左右 每种方法的优点和缺点是什么 跟进 在我的数据库中使用一
  • 为什么 Rails 5 将“索引”更改为“外键”?

    如果你在 Rails 4 中有这个 t references event index true 现在你可以使用foreign key代替index在 Rails 5 中 我不太明白为什么他们决定这样做 因为功能保持不变 您添加的是索引 而不
  • 通过使用 Minitest 的 Rails,如何设置 RuboCop 在每次使用 rake 运行测试时自动运行?

    当我运行以下命令时 我想要RuboCop https github com bbatsov rubocop在测试运行之前检查我指定的应用程序目录 bundle exec rake test 我添加了以下任务lib tasks test ra
  • 错误“未初始化常量 AWS (NameError)”

    它说 AWS 未初始化 我正在使用 aws sdk core gem 我尝试使用 aws sdk gem 代替 问题仍然存在 这是initializers aws rb 文件 AWS config access key id gt ENV
  • Hibernate 每个子类一个表继承策略的效率

    我正在考虑 Hibernate 管理的类层次结构的表布局 当然 每个子类表技术在我看来是一般意义上最合适的 然而 通过逻辑思考 我对其性能有些担忧 尤其是随着子类数量的扩展 举一个非常简短 且经典 的示例 假设您有以下类 public ab
  • Memcachier 达到缓存限制时 Heroku 请求超时

    我使用 Memcachier Dalli 作为客户端 将 Rails 应用程序部署到 Heroku 我正在使用免费插件 提供 25 MB 缓存 我们开始收到来自heroku的请求超时 经过调试 我们发现手动刷新Memcachier解决了问题
  • Rails Searchkick / Elasticsearch has_many 和belongs_to 关联

    我尝试使用 Searchkick 运行搜索并基于多个模型返回 我的书本模型包含这个 class Book lt ActiveRecord Base searchkick has many book subjects has many sub
  • Twitter Bootstrap 中下拉链接的模态

    我正在尝试从下拉菜单中的链接进行模式启动 该模式似乎已启动 网站变为灰色 但看不到 来自不在下拉列表中的常规链接的模态工作得很好 我对 jquery 进行了愚弄 但由于我是 jquery 的新手 所以没有任何结果 这是我的网站代码
  • HABTM 关系和accepts_nested_attributes_for

    我有一个可以让我创建的表单新博客文章我希望能够创造新类别来自同一个表格 我在帖子和类别之间有一个习惯关系 这就是我遇到麻烦的原因 我有以下2个型号 class Post lt ActiveRecord Base has and belong
  • 在 Rails 中禁用连接池以使用 PgBouncer

    我们有一个 Ruby on Rails 4 2 8 项目 可以访问大型 PostgreSQL 数据库 我们将使用 PgBouncer 添加一个新的连接池服务器 由于 PgBouncer 将处理数据库连接池 我们是否需要关闭 Rails 自动
  • 如何在列上创建外键,该列的每条记录都可能引用多个表之一中的列?

    我正在创建一个社交网络 它有新闻 照片等多个实体 可以有评论 由于所有评论都具有相同的列并且行为方式相同 唯一的区别是它们的类型 新闻 照片或将来添加的其他内容 我决定为所有评论创建一个表 其中的列名为type 它工作得很好 直到我决定将外
  • 在 Web 应用程序中显示最新的提交值?

    我有一些 Rails 应用程序 我使用 Git 作为版本控制系统 我使用 GitHub 或 Beanstalk 作为存储库主机 从理论上讲 我想要做的事情非常简单 以某种方式在 Web 应用程序的页脚中显示最新的提交 ID 号 哈希值 这样
  • 自定义通用 Rails 错误消息

    我们的 Rails 应用程序被设计为链接到多个客户端数据库的单个代码库 根据子域 应用程序确定要连接到哪个数据库 我们使用液体模板为每个客户定制演示文稿 我们无法为每个客户定制通用的 我们很抱歉 出了点问题 消息 谁能推荐一种方法让我们能够
  • 通过 ESI:include 设置 Cookie,如何?

    我正在尝试使用 esi 在我的网站上创建忍者缓存 这个想法是 该网站大部分是静态的 我只需要在用户是否登录时做一些花哨的事情 所以我试图在页面A上放置一个 并在页面B的应用程序中设置触发器 这样我就可以将页面 A 缓存在 varnish 上
  • Rails 3.1+ 的 Jasmine 与 Mocha JavaScript 测试 [已关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我对茉莉花有经验并且非常喜欢它 有谁有 Jasmine 和 Mocha 的经验 特别是 Rails 的经验吗 我想知道是否值得转用 我已经在 J
  • Rails 4 的 mobile_fu

    我正在尝试将我的应用程序从 Rails 3 2 13 切换到 Rails 4 在此过程中 我遇到了一个主要障碍 我使用 gem mobile fu 来确定用户是否来自移动设备 该 gem 需要 Railties 3 2 13 但 Rails
  • Capybara-webkit 无法处理与 bootstrap glyphicon 的链接

    我有一个链接 link to q span class glyphicon glyphicon trash span html safe feed item data confirm Are you sure toggle tooltip
  • 多次部署后 Heroku Slug 大小

    我有一个红宝石 on Rails非常接近 slug 大小限制 300mb 的应用程序 我已经尽可能地减小了尺寸 slugignore但还没有得到我想要的结果 一时兴起 我尝试创建一个新的Heroku应用程序并向其部署相同的 git 存储库
  • 无法使用 Rails 6 Actiontext 渲染 youtube 嵌入 iframe

    我已经设置了一个自定义嵌入模型 这样我就可以将 Instagram 或 YouTube 嵌入等内容添加到我网站上的 ActionText 内容中 它适用于 Instagram 嵌入 但不适用于 YouTube 作为参考 我要显示的 yout
  • Rails 3.1 中何时将图像放入 app/assets 以及何时放入 /public/images?

    我仍然不太明白 在这种情况下 在 Rails 3 1 中将图像放在哪里 图像被处理 例如通过回形针或蜻蜓 并存储在文件夹中 不使用像 s3 这样的外部服务 f e 在开发中 当我只有图像时 我将在样式表中使用它 例如背景 图标 AppSto

随机推荐

  • 是否可以使用多处理对一个 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 约定 我有一个