我使用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/