将数组传递给ActiveRecord #where时的结果不一致

时间:2017-03-14 16:57:23

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

我使用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范围内。

1 个答案:

答案 0 :(得分:0)

误报。连接的行为与子查询完全相同。当我测试加入方法时,我碰巧遇到了稳定的时期。我现在能够用这两种方法重现不一致。

问题是数据的合法变化速度足够快,以至于我看到结果波动很大。它源于<CONDITION>中的错误。