我刚刚使用标准 LAMP 配置全新安装了 Ubuntu Server 10.04。
然后我编写了一个小脚本来测试向一个有 3 列的表中插入的速度。
当我在任何其他机器(centos 和 fedora)上运行该脚本时,我每秒会得到大约 2000-3000 个插入。
在 Ubuntu 机器上,我每秒大约插入 20 条(完全相同的脚本)。
我尝试切换脚本以使用套接字,但没有任何改变。
当我执行 mysql 转储和恢复时,mysql 表现非常好,并在大约 20 秒内将 1,000,000 条记录加载到表中。
为什么 PHP 在 mysql 中的查询率如此糟糕?(我尝试使用 pdo 和 mysqli - 它们都得到相同的结果)。
当前安装:
libmysqlclient16 5.1.41-3ubuntu12
mysql-client-5.1 5.1.41-3ubuntu12
mysql-client-core-5.1 5.1.41-3ubuntu12
mysql-common 5.1.41-3ubuntu12
mysql-server 5.1.41-3ubuntu12
mysql-server-5.1 5.1.41-3ubuntu12
mysql-server-core-5.1 5.1.41-3ubuntu12
php5-mysql 5.3.2-1ubuntu4.2
libapache2-mod-php5 5.3.2-1ubuntu4.2
php-apc 3.1.3p1-2
php5-cli 5.3.2-1ubuntu4.2
php5-common 5.3.2-1ubuntu4.2
php5-mysql 5.3.2-1ubuntu4.2
编辑/解决:
我重新安装了 Ubuntu,问题依旧。我安装了 Fedora 13,问题依旧……然后我研究了一下表格,发现是 InnoDB 的问题(MyISAM 每秒插入数千行)。
事实证明,innodb_flush_log_at_trx_commit 默认为“1”,这意味着每次写入时都会刷新到磁盘……这严重影响了我的性能。由于这是一台糟糕的消费级戴尔电脑,当我切换到 innodb_flush_log_at_trx_commit=0(每秒刷新一次)时,性能飙升。我现在能够在 45 秒内插入 1,000,000 行。:D
答案1
听起来你的 MySQL 配置需要调整。任何发行版上的基本 MySQL 配置都会比较保守,假设它们不是服务器上运行的唯一服务。你应该花些时间对其进行调整。如果你的表是 InnoDB 格式,请确保将变量调整innodb_buffer_pool_size
到系统内存的大约 80%(假设它是唯一要运行的服务)。
这可能是比较操作系统时首先要考虑的地方。每个发行版都有自己的标准。如果您想在它们之间进行公平的测试,您应该匹配配置。
希望这可以帮助!
答案2
我同意 troyengel 的观点。您需要比较在出现不同行为的服务器上的 my.cnf,以查看瓶颈可能在哪里。从您自己的测试来看,这似乎更有可能与您的 MySQL 配置有关,而不太可能与您的 PHP 配置有关。-- dxjones