关于Rails中ApplicationRecord的find()方法时间复杂度及相关概念的疑问
关于Rails中ApplicationRecord的find()方法时间复杂度及相关概念的疑问
嘿,我来帮你把这些疑问理清楚~
首先得纠正一个小误解:ApplicationRecord并不是替代或废弃ActiveRecord的新东西。在Rails 5及之后的版本里,ApplicationRecord是所有模型的基类,但它本身继承自ActiveRecord::Base——ActiveRecord一直是Rails核心的ORM(对象关系映射)组件,从来没被废弃过。引入ApplicationRecord主要是为了给所有模型提供一个统一的“入口”,方便你在这一层添加全局的回调、验证或者其他共享逻辑,让模型代码更整洁,而模型的所有数据库交互能力,本质上还是由ActiveRecord提供的。
然后说说你关心的find()方法时间复杂度:你的假设不完全准确哦。默认情况下,find()是根据主键(比如id)来查询数据的,而数据库的主键默认会建立唯一索引。有索引加持的情况下,这个查询的时间复杂度是O(log n),不是严格的常数时间O(1)。不过在实际开发中,因为数据库对索引的优化做得非常好,当数据量不是极端庞大的时候,这个查询速度快到几乎和常数时间没差别。但如果你用find查询的是非索引字段(比如自定义的某个没有加索引的属性),那时间复杂度就会变成O(n),查询速度会随着数据量的增加明显变慢。
简单总结下:find()的效率取决于你查询的字段有没有索引,主键查询因为默认带索引,所以效率极高,但不是严格意义上的常数时间。
备注:内容来源于stack exchange,提问作者K Man
相关产品推荐
相关产品推荐

