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

标签 php performance mysqli phpunit

我的测试运行得很慢...我进行了不到 100 次测试,但在快速机器上运行仍然需要 10 秒以上。我尝试禁用代码覆盖率,并对我所做的几件事使用缓存(例如 LDAP)。

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

screenshot

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

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

最佳答案

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

每个示例:

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

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

$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 操作系统)。这消除了 TCP 握手和纠错的开销,以及网络延迟,因为它是在本地执行的。

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

关于php - 有没有办法提高 mysqli->prepare 的执行速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7728064/

相关文章:

javascript - 对 JavaScript 文件强制进行 GZIP 压缩

c# - 设计库性能比较测试

php - 严格标准 : mysqli_next_result() error with mysqli_multi_query

php - 使用 MySQLi 安全地创建动态表

javascript - Symfony2 需要一些关于购物车的清晰度和指导(关于数量)

php - libphp7.so 需要 12.0.0 或更高版本

Java Math.abs 与 Math.pow

php - mysqli 搜索仅适用于 1 个参数

javascript - 单击指向 php 脚本的链接时停止重新加载页面

php - 找不到 Laravel 5 类,使用命名空间