【发布时间】:2017-03-14 16:57:22
【问题描述】:
我使用 Rails 4.2.7.1、Ruby 2.3.1 和 MySQL 作为我的数据库。我有一个后台工作,负责收集有关执行一些非常昂贵的读取操作的数据库的分析。其中一个特别是行为不一致,这似乎是由 SQL 查询中 IN 子句的行为不一致引起的。
rails 调用看起来像这样:
MyModel.some_scope.where(id: OtherModel.where(<CONDITION>).group(:my_model_id).select(:my_model_id)).count
这归结为生成的 SQL 查询中的 IN 子句。这通常可以正常工作,但是当嵌套查询 (OtherModel...) 变大(~2000 个结果)时,我开始看到来自 IN 的结果不一致。一遍又一遍地运行查询时,我看到的值会随着数据库的实际更改而上下浮动。
如果我重写上面的查询以使用连接,如下所示:
MyModel.some_scope.joins(:other_model).where(<CONDITION>).select(:id).uniq.count
我每次都从查询中看到一致的结果。在这种情况下,我重新编写查询没有问题,因此可以解决我的问题,但我真的很想了解 MySQL 中发生了什么导致奇怪的行为。
值得注意的是,工作查询(带有连接)返回 ~1300 条记录,而损坏的查询在 ~1400-1600 范围内。
【问题讨论】:
-
尝试
MyModel.joins(:other_model).some_scope.count之类的方法,看看是否可行。IN语句非常繁重,如果您包含超过 2000 个可能的值,则更多。更新:我没有看到那个组。您也可以将其添加到查询MyModel.joins(:other_model).some_scope.group(:my_model_id).count,或类似的东西。 -
是的,正如我在问题中所说,连接方法是一致的。解决方法工作正常,但我希望了解为什么 IN 方法不一致。慢我会理解(并期待),但不一致让我感到惊讶。
标签: mysql ruby-on-rails rails-activerecord