我注意到我的一台运行 Apache/PHP/MySQL 的服务器存在性能问题。
因此我决定调查并针对其他服务器进行测试。
我做了什么?
在三台不同的服务器中,我创建了一个数据库(db_sandbox),单数据库桌子 (表沙箱),共 4 列(ID(整数),标题(varchar 255),描述(文本),日期(时间戳))。笔记: ID是具有自动增量的主键。
我创建了一个简单的 PHP 例程,将 15,000 条记录放入此表,以 5,000 条为一组,使用 3 种不同的方法:
- 方法 1:5,000 条插入命令,每条命令都通过 5,000 个单独查询进行单独处理
- 方法 2:在一次对 DB 的调用中插入 5.000 条命令,以分号分隔。
- 方法 3:1 个插入 5,000 条记录的命令。
首先,从性能上看,方法2和方法3显然是最好的。但这不是重点。在现实世界中,方法2和方法3只是理想情况,很少发生。
无论如何,当我比较每个结果时,我感到很惊讶。考虑到 SERVER-1 是我的问题服务器,我得到了以下结果:
- 方法 1:SERVER-2 是速度快 165 倍SERVER-3 是速度快 40 倍;
- 方法 2:SERVER-2 是6倍速度更快,SERVER-3速度快 7 倍;
- 方法 3:SERVER-2 是慢 5%SERVER-3 是速度快 1.5 倍;
我的结论是,SERVER-1 的设置中存在一些影响多个单独查询的运行的问题。
有谁知道它们可能是什么设置?
服务器1:这是一个虚拟机
- 英特尔至强 E5-2630 v3 2.4GHz
- 16GB 内存
- 固态硬盘 120GB
- Windows Server 2012 R2
- MySQL 5.6
- 虚拟机
服务器-2
- 英特尔至强X3360 2.83GHz
- 4GB 内存
- 固态硬盘 250GB
- Windows Server 2003(准备退役)
- MySQL 5.0
服务器-3
- 英特尔 I7-3770 3.4GHz
- 16GB 内存
- 固态硬盘 120GB
- Windows 8.1 专业版
- MySQL 5.6
笔记:我比较过我的配置文件从服务器-1和服务器-3而且它们实际上是完全相同的。服务器-2, 跑步Mysql 5.0非常不同。
答案1
如果我读完并理解了您的问题,您正在比较在 ESXi 上运行的 Windows VM 中获得的结果与在裸机上运行操作系统的服务器 2 和 3 中获得的结果。
只要硬件保持相似,您就不可能在虚拟机上看到更好的性能。
裸机数据库服务器总是会更快。你排队的磁盘写入越多,这最后一句话就越正确。
减慢 Server1 上插入速度的可能是虚拟化层,并且有大量文献讨论在性能很重要的情况下不应该虚拟化什么。
此外,在没有闪存缓存硬件 raid 控制器的 ESXi 上尤其如此。
答案2
经过大量测试和尝试不同的组合后,我不能说我找到了完美的解决方案,其中可能包括我的 IT 人员找不到的一些 VM 设置。无论如何,以下是真正对性能产生影响的两件事(请记住,这仅适用于数据库引擎):
1-使用事务,即关闭自动提交,执行所有事务,并在最后提交。
2 - 你可以通过设置获得巨大的性能提升innodb-在trx提交时刷新日志到0或者1。请阅读完整文档了解此行为的后果。
我希望它能够帮助其他人。