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

Bil*_*eal 2 php performance phpunit mysqli

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

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

截图

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

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

net*_*der 6

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

每个例子:

mysql> PREPARE stmt1 FROM 'SELECT * FROM mysql.user';
mysql> EXECUTE stmt1;
Run Code Online (Sandbox Code Playgroud)

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

$mysqli->prepare('SELECT * FROM mysql.user');
Run Code Online (Sandbox Code Playgroud)

...你可以在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)
Run Code Online (Sandbox Code Playgroud)

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

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

  • @Billy ONeal:依赖于依赖的任何东西都不能作为单元测试,因为当它发生时,它会测试多个代码单元.两个代码单元将使其成为*单位*测试.:)此外,如果您的数据库失败,崩溃等,即使代码和测试100%有效,您的测试也会失败,并且单元测试只有在编写错误时才会失败,而不是如果外部组件不是表现为预期. (3认同)