Laravel查询效率差异:以下两组查询方式哪类执行效率更高?
Laravel 两组查询操作执行效率对比
先说结论:两组写法都是后者的执行效率更高,差距会随数据表数据量增大而被拉得更大。
1. Eloquent 查询写法对比:Car::all() 与 Car::find()
Car::all()底层生成的SQL是SELECT * FROM car,会直接拉取数据表的所有记录,返回包含全部行数据的 Eloquent 集合。查询开销和表数据量正相关,表越大、字段越多,IO 消耗和内存占用就越高。- 注意
Car::find()属于需要传入主键参数的用法,比如常规写法为Car::find($id),底层生成的SQL是SELECT * FROM car WHERE id = ? LIMIT 1,走主键索引仅查询匹配的单条记录,返回单个 Eloquent 模型实例,查询耗时基本稳定在毫秒级,不受全表数据量影响。 - 效率差异:只要表内数据量大于1,正常传参使用的
Car::find()效率远高于Car::all(),二者的查询成本不在一个量级。
2. 查询构造器查询写法对比:DB::table('car')->get() 与 DB::table('car')->first()
DB::table('car')->get()和 Eloquent 的all()逻辑完全一致,生成SQL也是SELECT * FROM car,返回包含全表所有记录的集合,需要拉取全表数据,开销随表体积线性增长。DB::table('car')->first()底层生成的SQL是SELECT * FROM car LIMIT 1,仅返回查询结果的第一条数据,不需要遍历全表,哪怕表内有百万级数据,也只返回一条,IO 和内存开销极小。- 效率差异:
first()效率远高于同场景下的get(),数据量越大优势越明显。
补充说明:如果
Car::find()不传任何参数属于错误用法,会返回空或者抛出异常,不具备效率对比的意义,业务场景下都是传入主键参数使用。
如果是相同单条查询的场景,查询构造器的性能会略高于 Eloquent,因为 Eloquent 多了一步将查询结果封装为模型实例的开销,但这个开销和全表查询的开销相比可以忽略不计。
内容的提问来源于stack exchange,提问作者wawingi Sebastiao
相关产品推荐
相关产品推荐

