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

最佳答案

错误的警报。联接的行为与子查询完全相同。当我测试加入方法时,我碰巧达到了稳定时期。现在,我可以用两种方法重现不一致之处。

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

关于mysql - 将数组传递给ActiveRecord#where时结果不一致,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42792077/

10-13 01:37