5

我刚刚在 Laravel 中测试了 Eloquent ORM 的性能,很震惊地发现一个简单的查询需要 3 秒以上的时间才能执行,而普通的 Laravel 查询需要 0.1 秒才能完成。我只返回 1500 条记录。

DB::table('t_organisations')->get();  -  0.12253594398499 seconds
Organisation::all();   -   3.6389181613922 seconds

这肯定不正常!?我认为我在设置中没有遗漏任何内容。我的数据库已标准化。可能是什么问题呢?

4

3 回答 3

5

当您这样做时 DB::table('t_organisations')->get(); ,它将所有结果作为数组(或对象)获取,但不会将它们水合到模型中。如果您想快速解释,请参阅此 stackoverflow 答案。

当你做 Organisation::all(); 水化过程时,这就是请求需要更长的时间的原因(你必须分配内存中的所有对象并用字段填充它们)。有许多关于水合优化的链接/教程可以帮助您更好地请求数据库,并在不需要时避免对象的水合。

于 2016-06-28T10:42:33.657 回答
2

感谢你的回复。

这是mysql查询日志的结果:

组织::all(); - 1.6772060394287 秒

130710  9:52:43     5 Connect   seltec@localhost on seltec
            5 Prepare   set names 'utf8' collate 'utf8_unicode_ci'
            5 Execute   set names 'utf8' collate 'utf8_unicode_ci'
            5 Close stmt    
            5 Prepare   select * from `users` where `id` = ? limit 1
            5 Execute   select * from `users` where `id` = '2' limit 1
            5 Close stmt    
            5 Prepare   select * from `t_organisations`
            5 Execute   select * from `t_organisations`
130710  9:52:44     5 Close stmt    
130710  9:52:45     5 Quit

DB::table('t_organisations')->get(); - 0.13963603973389 秒

130710  9:55:16     6 Connect   seltec@localhost on seltec
            6 Prepare   set names 'utf8' collate 'utf8_unicode_ci'
            6 Execute   set names 'utf8' collate 'utf8_unicode_ci'
            6 Close stmt    
            6 Prepare   select * from `users` where `id` = ? limit 1
            6 Execute   select * from `users` where `id` = '2' limit 1
            6 Close stmt    
            6 Prepare   select * from `t_organisations`
            6 Execute   select * from `t_organisations`
            6 Close stmt    
            6 Quit

所以没有区别......这意味着延迟必须存在于 Eloquent php 代码中。是的,我安装了 xdebug,不,我不准备浪费我的时间来弄清楚为什么它很慢!!!如果它在查询生成器中更快,那对我来说已经足够了!!

@Laravels 的开发人员:在框架上做得很好。它很直观,可以很好地处理授权,尤其是 Leroy Merlin 的 confide 和 entrust 插件。不过,您可能想看看 Eloquent 性能问题!!

干杯! 克雷格

于 2013-07-10T08:07:20.960 回答
2

确保在测试之间执行 RESET QUERY CACHE 以清除 MySQL 查询缓存。从您发布的时间戳来看,您似乎首先进行了 Eloquent 查询,这意味着它们可能在您进行第二次测试时已被缓存。这可以解释巨大的性能差异,尽管由于额外的开销,我确实怀疑 Eloquent 比普通的 Laravel 查询慢一点。

于 2014-01-08T04:07:40.350 回答