PHP+MySQL 插入数据性能测试
学习记录 留作参考
祝君好运
测试条件
- PHP7.3.4、MySQL5.7.26、WIN11 。使用命令行模式执行PHP代码,PDO形式连接数据库。
- 每次测试插入前均为空表,表内共13个字段:int*3、varchar*1、text*9,使用utf8编码。
- 平均每条数据待存储的内容大小为 4KB 。
测试代码
测试结果
使用InnoDB
- 循环执行 50次单条插入语句,不使用事务,测试10次,平均耗时 0.036135983467102
- 循环执行500次单条插入语句,不使用事务,测试10次,平均耗时 0.33866319656372
- 循环执行 50次单条插入语句, 使用事务,测试10次,平均耗时 0.010811376571655
- 循环执行500次单条插入语句, 使用事务,测试10次,平均耗时 0.069037747383118
- 循环执行 50次单条插入语句,不使用事务,使用prepare预处理sql,测试10次,平均耗时 0.039885687828064
- 循环执行500次单条插入语句,不使用事务,使用prepare预处理sql,测试10次,平均耗时 0.36127474308014
- 循环执行 50次单条插入语句, 使用事务,使用prepare预处理sql,测试10次,平均耗时 0.014089918136597
- 循环执行500次单条插入语句, 使用事务,使用prepare预处理sql,测试10次,平均耗时 0.088695383071899
- 50 条数据拼接成一条插入语句,不使用事务,测试10次,平均耗时 0.0077745199203491
- 500条数据拼接成一条插入语句,不使用事务,测试10次,平均耗时 0.04852921962738
- 50 条数据拼接成一条插入语句, 使用事务,测试10次,平均耗时 0.0079685926437378
- 500条数据拼接成一条插入语句, 使用事务,测试10次,平均耗时 0.049140906333923
- 50条数据拼接成一条插入语句并连续执行10遍,不使用事务,测试10次,平均耗时 0.050497055053711
- 50 条数据拼接成一条插入语句并连续执行10遍, 使用事务,测试10次,平均耗时 0.048738098144531
使用MyISAM
- 500条数据拼接成一条插入语句,使用事务,测试10次,平均耗时 0.026592636108398
测试总结
- 当使用单条插入语句时
- 一次插入50条,不开事务的耗时是开启事务的 3.3 倍。
- 一次插入500条,不开事务的耗时是开启事务的 4.9 倍。
- 当将待插入数据拼接成一条语句执行时
- 一次插入50条,不使用事务,多条耗时是单条的 4.64 倍。使用事务,多条耗时是单条的 1.35 倍。
- 一次插入500条,不使用事务,多条耗时是单条的 6.97 倍。使用事务,多条耗时是单条的 1.40 倍。
- 一次插入500条,与一次插入50条*10次,的性能差距很小,是否开启事务的影响也很小。
- 是否对单条语句开启事务对性能的影响微乎其微。事务的开启与提交会消耗一点性能而导致稍慢。单条语句开启事务也没有什么实际意义。
- 当一次插入多条数据时,如果数据量过大,可能会导致该语句超过MySQL可接受的数据包大小。
- 可通过拆分数据,将一次插入全部数据,改成分批多次插入数据。
- 具体MySQL可接受数据包字节数可通过该命令查看:
show VARIABLES like '%max_allowed_packet%';
- 关于MySQL的prepare
- 在执行插入操作时没有得到预想的性能提升,可能是因为prepare更应该用在查询数据的场景(后续再追加测试吧)。
- 使用prepare后,可以不必再对单引号、双引号、反斜杠等特殊字符转义。若预先手动转义,将导致转义叠加,使记录的数据与原始数据不一致。
- 关于MySQL的存储引擎
- 单条语句插入500条数据,使用
InnoDB
的耗时是MyISAM
的 1.8 倍。 - 若对
MyISAM
使用事务,回滚是无效的,也不会报错(应该可以认为是仅对支持事务的数据表进行回滚操作)。
- 单条语句插入500条数据,使用
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!