Eloquent是否缓存预备语句?

时间:2015-09-25 15:59:54

标签: pdo laravel-5 eloquent prepared-statement query-optimization

我要执行一系列INSERT语句,我想使用Laravel的Eloquent来执行此操作:

$mountain = Mountain::find(1);
$dragons = [1, 2, 3, 4];
foreach ($dragons as $id){
    $mountain->dragons()->attach($id);  // Eloquent performs an `INSERT` here
}  

我知道Eloquent使用预处理语句,但它会在每次迭代时重新准备相同的查询,或者它是否足够聪明以在第一次迭代时缓存准备好的INSERT语句,然后在每次后续迭代中运行->execute

来自PHP's PDO documentation

  

通过使用预准备语句,应用程序可以避免重复分析/编译/优化循环。这意味着预准备语句使用的资源更少,因此运行速度更快。

我意识到在整个应用程序生命周期中保存每个准备好的语句可能不是最好的主意,但在某些情况下似乎是有道理的。如果Eloquent默认不这样做,有没有办法告诉它为特定的模型操作缓存准备好的语句?

2 个答案:

答案 0 :(得分:1)

嗯,聪明的应用肯定不会保持每个准备好的声明永远打开以防万一。这种行为会带来更多弊大于利。

关于' good',你在这个" caching"中提出了太多的意义。和"分析/编译/优化"。从准备好的声明中获得速度增益的想法有点夸张。说到你的特定情况,你知道,在INSERT查询中没有太多优化。你永远无法衡量这种优化"。

因此,没有太多担心。

答案 1 :(得分:1)

结帐Illuminate\Database\Eloquent\Relations\BelongsToMany.php::attach

调用$query->insert,这是Illuminate\Database\Query\Builder类的一个实例。

现在查看所述Builder类中的方法insert

我不会发布Laravel代码,因为它太长了,但您可以清楚地看到查询是针对当前连接立即编译和执行的。

开源代码的优势在于您可以自由地浏览它,所以不要害怕浏览它。

正如您的常识所指出的,这里节省的时间很短。如果您执行许多插入,这不会成为您的瓶颈。也许看看队列或后台服务 - 用户不应该在你的应用程序执行1000次插入时等待。