[我发现了FlourishLib,我正在查看他们的fDatabase.php代码,以了解它们如何处理sql查询,当我使用MySQL时,它们禁用了已准备好的查询,我感到非常惊讶
$this->connection->setAttribute(PDO::MYSQL_ATTR_DIRECT_QUERY, 1);
(line 599)
他们为什么这样做?
我习惯了PDO.prepare和PDOStatement.execute,我想知道为什么要这样选择。
很长一段时间以来,MySQL服务器端准备好的语句一直是理论上的性能损失和烦恼的来源。 This MySQL Performance Blog post from 2006概述了大多数原因。需要注意的是查询缓存以及准备好的语句如何绕过查询,为prepare-params-execute循环进行了额外的往返,并针对可以用作和不能用作占位符值的条件制定了更严格的标准。
Starting with MySQL 5.1.17,some,但现在并非所有准备好的语句都可以使用查询缓存。其他小问题仍然存在。
值得一提的是,对于PDO如何准备语句,有two控件。另一个称为PDO::ATTR_EMULATE_PREPARES
。另请参阅:this not-quite-dupe question from earlier this year。