phpEnv是一款集成了PHP、MySQL、Nginx等多种开发组件的本地环境搭建工具,很多开发者会在该环境下进行项目开发和功能验证,当项目涉及高并发数据更新场景时,提前对MySQL进行并发更新性能测试就很有必要,能提前发现数据库层面的性能问题。

环境准备与工具选择
首先确保phpEnv已经正常安装并启动,MySQL服务处于运行状态。本次压测我们选择mysqlslap作为测试工具,它是MySQL官方自带的压测工具,无需额外安装,能够模拟多客户端并发执行SQL语句,非常适合做并发更新类的性能测试。
先登录phpEnv中的MySQL,创建一个测试用的数据库和表,执行以下SQL语句:
-- 创建测试数据库
CREATE DATABASE IF NOT EXISTS pressure_test DEFAULT CHARSET utf8mb4;
-- 使用测试数据库
USE pressure_test;
-- 创建测试表,包含自增主键和计数字段
CREATE TABLE IF NOT EXISTS update_test (
id INT PRIMARY KEY AUTO_INCREMENT,
count_num INT DEFAULT 0,
update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 插入初始测试数据,插入100条记录
INSERT INTO update_test (count_num) VALUES (0),(0),(0),(0),(0),(0),(0),(0),(0),(0);
编写并发更新测试脚本
并发更新的核心逻辑是多个客户端同时对同一条或不同条记录的计数字段执行加1操作,我们可以通过mysqlslap的自定义SQL参数来指定更新语句。如果需要更复杂的更新逻辑,也可以编写PHP脚本配合多进程来模拟并发。
方式一:使用mysqlslap直接测试
打开phpEnv自带的命令行工具,执行以下命令即可启动并发更新测试:
mysqlslap -h 127.0.0.1 -u root -p --concurrency=50,100,200 --iterations=3 --number-int-cols=1 --number-char-cols=0 --auto-generate-sql --auto-generate-sql-load-type=update --engine=innodb --create-schema=pressure_test --query="UPDATE update_test SET count_num=count_num+1 WHERE id=1" --number-of-queries=1000
命令参数说明:
- --concurrency:指定并发客户端数量,这里测试50、100、200三个并发梯度
- --iterations:每个并发梯度执行的测试次数,取平均值更准确
- --number-of-queries:总执行查询数,这里总共执行1000次更新操作
- --query:自定义要执行的更新SQL语句,这里是对id为1的记录做累加更新
- --create-schema:指定使用的测试数据库
方式二:PHP多进程模拟并发更新
如果需要更贴近业务场景的并发逻辑,可以编写PHP脚本,利用pcntl扩展创建多进程模拟并发,代码如下:
<?php
// 数据库连接配置
$db_host = '127.0.0.1';
$db_user = 'root';
$db_pass = 'root'; // phpEnv默认MySQL密码,根据实际配置修改
$db_name = 'pressure_test';
// 并发进程数
$process_num = 50;
// 每个进程执行的更新次数
$update_per_process = 20;
// 创建子进程
for ($i = 0; $i < $process_num; $i++) {
$pid = pcntl_fork();
if ($pid == -1) {
die('创建进程失败');
} elseif ($pid == 0) {
// 子进程逻辑:连接数据库并执行更新
$conn = new mysqli($db_host, $db_user, $db_pass, $db_name);
if ($conn->connect_error) {
die('数据库连接失败:' . $conn->connect_error);
}
for ($j = 0; $j < $update_per_process; $j++) {
// 随机更新不同id的记录,避免行锁竞争过于集中
$random_id = rand(1, 100);
$sql = "UPDATE update_test SET count_num=count_num+1 WHERE id={$random_id}";
$conn->query($sql);
}
$conn->close();
exit(0);
}
}
// 父进程等待所有子进程结束
while (pcntl_waitpid(0, $status) != -1) {
$status = pcntl_wexitstatus($status);
}
echo "所有并发更新任务执行完成" . PHP_EOL;
?>
测试参数调整与结果分析
执行测试后,会得到不同并发梯度下的平均耗时、每秒查询数等关键指标,我们可以通过调整以下参数来观察MySQL的性能变化:
| 调整参数 | 调整方向 | 预期影响 |
|---|---|---|
| 并发客户端数量 | 逐步从50提升到500 | 并发越高,锁竞争越激烈,平均耗时会增加,每秒查询数先升后降 |
| 更新记录范围 | 从单条记录更新改为多条随机记录更新 | 减少行锁冲突,性能会有所提升 |
| MySQL innodb_buffer_pool_size | 在phpEnv中调大该参数 | 缓存更多数据和索引,更新操作的性能会明显提升 |
如果测试过程中出现大量锁等待超时,或者每秒查询数下降明显,说明当前MySQL配置无法支撑对应的并发量,需要优化数据库配置或者调整业务更新逻辑,比如将集中更新改为批量更新、增加缓存层减少数据库直接更新压力等。
注意事项
压测前一定要确认测试的是本地phpEnv环境,不要连接到线上数据库,避免对生产环境造成影响。测试完成后可以清空测试数据库,避免占用不必要的存储空间。另外如果phpEnv的MySQL默认配置较低,压测结果可能和服务器环境的真实表现有差异,仅作为本地开发阶段的参考即可。