执行多个单独的MySQL查询时非常慢

我一直在注意到运行Apache / PHP / MySQL的服务器中的一个性能问题。

所以我决定对其他服务器进行调查和testing。

我做了什么?

在三台不同的服务器上,我创build了一个包含4列( id (int), title (varchar 255), description (text), date (timestamp))的单个innodb表( table_sandbox )的数据库( db_sandbox )。 注意: id是自动增量的主键。

我创build了一个简单的PHP例程,该例程包含15.000条logging到这个表中,使用3种不同的方法:

  • 方法1 :5.000插入命令,每个单独处理通过5.000单个查询
  • 方法2 :5.000插入命令,用分号分隔,在一次调用数据库。
  • 方法3 :1插入5.000条logging的命令。

在别的之前,方法2和3显然是性能最好的。 但这不是重点。 实际上,方法2和3只是理想的情况,但很less发生。

无论如何,当我比较这些结果时,我感到惊讶。 考虑到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的设置中有一些影响多个单独查询的运行。

有谁知道他们可能是什么设置?

SERVER-1:这是一个虚拟机

  • Intel Xeon E5-2630 v3 2.4GHz
  • 16GB RAM
  • SSD 120GB
  • Windows Server 2012 R2
  • MySQL 5.6
  • VMWare的

SERVER-2

  • Intel Xeon X3360 2.83GHz
  • 4GB内存
  • SSD 250GB
  • Windows Server 2003(准备退休)
  • MySQL 5.0

SERVER-3

  • 英特尔I7-3770 3.4GHz
  • 16GB RAM
  • SSD 120GB
  • Windows 8.1专业版
  • MySQL 5.6

注意 :我比较了SERVER-1SERVER-3的 my.ini ,它们几乎完全相同。 SERVER-2 ,运行Mysql 5.0有很大的不同。

经过大量的testing和尝试不同的组合,我不能说我find了完美的解决scheme,这可能包括我的IT人员找不到的虚拟机设置。 无论如何,以下是真正改善性能的两件事情(请记住,这仅适用于INNODB ):

1 – 使用事务,即closures自动提交,完成所有事务,并在最后提交。

2 – 通过将innodb-flush-log-at-trx-commit设置为01,可以大大提高性能。 请阅读完整的文档以了解此操作的后果。

我希望这会帮助别人。