有没有办法提高mysqli->准备的执行速度?

时间:2011-10-11 14:56:36

标签: php performance mysqli phpunit

我的测试运行得很慢......我的测试不到100次,但在快速机器上运行仍需要10秒钟。我尝试禁用代码覆盖,并使用缓存来处理远程服务器(例如LDAP)所做的几件事。

在PHPUnit运行时分析测试产生:

screenshot

完全10%的运行时间 - 包括收集信息和生成大量代码覆盖页面的时间 - 花费在mysqli->prepare上。不幸的是,我不能在这里抽象数据库。我不仅有效地测试数据库访问层本身,还在测试代码中的JOIN内实现了许多逻辑。

我是否可以更改任何配置设置或其他任何性质以使其更快? prepare是否需要调用mysql服务器(因此设置本地mysql服务器进行测试可能有帮助吗?)

1 个答案:

答案 0 :(得分:6)

是的,prepare()语句将调用MySQL服务器。准备好的语句在服务器端通过两个呼叫执行:PREPARE呼叫和EXECUTE呼叫。

每个例子:

mysql> PREPARE stmt1 FROM 'SELECT * FROM mysql.user';
mysql> EXECUTE stmt1;

对于任何驱动程序都是如此,无论它是JDBC驱动程序的PHP驱动程序。为了进一步证明它确实进行了调用,请执行以下代码:

$mysqli->prepare('SELECT * FROM mysql.user');

...你可以在MySQL中看到以下内容:

mysql> show processlist;
+-----+------+-----------+------+---------+------+-------+--------------------------+
| Id  | User | Host      | db   | Command | Time | State | Info                     |
+-----+------+-----------+------+---------+------+-------+--------------------------+
| 564 | root | localhost | NULL | Query   |    0 | NULL  | show processlist         |
| 565 | root | localhost | NULL | Prepare |    0 | NULL  | SELECT * FROM mysql.user |
+-----+------+-----------+------+---------+------+-------+--------------------------+
2 rows in set (0.00 sec)

要加速这一点,您可以在本地计算机上使用 UNIX域套接字(假设您有POSIX OS)。这消除了TCP握手和纠错的开销,以及因本地执行而导致的网络延迟。

然而,最好的解决方案是使用模拟对象抽象数据库连接,但您已经知道了。如果必须连接到数据库,则单元测试不是单元测试:它是集成测试。