【问题标题】:How to specify 'USE INDEX' in a JOIN using activerecord如何使用 activerecord 在 JOIN 中指定“使用索引”
【发布时间】:2016-10-26 19:35:50
【问题描述】:

当存在多个JOINs 时,有没有办法强制在Rails 中具有活动记录的JOIN 上建立索引?

我希望最终的 SQL 生成为:

SELECT *
FROM table1
INNER JOIN table2
ON table1.id = table2.id
INNER JOIN table3 USE INDEX('my_index')
ON table2.new_id = table3.new_id

希望这样的事情是可能的吗?

【问题讨论】:

  • 哪个数据库?通常数据库会决定是否使用索引。如果您在正确的字段上创建索引,并且数据库的查询规划器认为该索引对您提交的查询有意义,它将使用该索引。
  • @DaveSlutzkin 那很好,但至少 MySQL 在使用现有索引时有时会做出非常糟糕的决定。
  • 我们看实际查询,加上SHOW CREATE TABLE。也许我们可以改变一些东西来达到目的。

标签: mysql ruby-on-rails ruby activerecord indexing


【解决方案1】:

Rails 不支持开箱即用的连接。但是您始终可以将字符串传递给joins,以准确描述您想要的内容:

Post
  .joins(:author)
  .joins("INNER JOIN comments USE INDEX('myindex') ON comments.post_id = posts.id")

我使用postsuserscomments 代替table1table3,因为table1 等不遵循Rails 命名约定。

【讨论】:

    猜你喜欢
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    相关资源
    最近更新 更多