我们使用 MySQL 5.5 和 PostgreSQL 9.0.4 进行了一个简单的测试。测试非常简单。我们正在循环中插入表。我们有一个简单的表,其中包含一个字段integer autoincrement primary key
和一些文本字段。
PostgreSQL 的客户端程序是用 JAVA 编写的。MySQL 的客户端程序是用 PHP(从命令行运行)编写的。
PostgreSQL 在 Windows XP Service pack 3 下运行。MySQL 在 Fedora 15 下运行。MySQL 也使用 InnoDB 作为存储引擎。
所有配置保留为默认设置。无变化(安装配置)
PostgreSQL 每秒执行大约 1063 个 INSERT 事务。MySQL 每秒执行大约 30 个 INSERT 事务。
我想肯定有问题。有还是正常?
答案1
好问题。绝对可以通过通过终端(Shell)直接向 Mysql 发出请求来解决问题。
我的意思是,当你通过命令使用 php 时,会浪费很多时间。我尝试使用以下查询来做到这一点:
insert into test(`id`,`txt`)values
('0','hello world'),
('1','hello world'),
('2','hello world'),
('3','hello world'),
.
.
.
('500','hello world');
结果是:
Query OK, 501 rows affected (0.06 sec)
Records: 501 Duplicates: 0 Warnings: 0
我的系统中的 MySQL 以每秒 833 个插入的速度处理这些请求。
答案2
也许,如果你在完全相同的系统上设置你的 mysql 和 pgsql 并使用完全相同的客户端,你可以比较结果......
另外,您检查过您的设置吗?
我认为您没有可靠的结果可供比较。
答案3
默认情况下,InnoDB 会在每次提交后将数据刷新到磁盘。如果您使用 PHP 一次发送一个插入查询,则每个查询都可能会自动提交并导致磁盘刷新。
您可以通过设置来更改此行为innodb_flush_log_at_trx_commit = 2
在您的 中my.cnf
,这将确保文件每秒仅刷新到磁盘一次。这将为您提供更好的批量插入性能。
大部分混乱可能是由于您的测试环境有很大不同而造成的。了解了典型的 Java/JDBC 代码与典型的 PHP 代码相比的外观后,我猜 Java 版本会以单笔交易而 PHP 版本则依赖于自动提交这将导致交易数量的大幅增加。
答案4
听起来您需要配置 InnoDB 缓冲池。
首先执行以下操作:将这些行添加到 /etc/my.cnf
[mysqld]
innodb_file_per_table
innodb_log_buffer_size=32M
innodb_buffer_pool_size=2G
innodb_log_file_size=2047M
innodb_open_files=25000
然后,尝试以下操作:
cd /var/lib/mysql
rm -f ib_logfile[01]
service mysql start
启动mysql将导致mysqld服务器进程重新创建ib_logfile0和ib_logfile1
为了创造一个公平的竞争环境,您必须为 PostgreSQL 设置类似的缓冲区。
无需设置任何内容,您很快就发现 PostgreSQL 的默认设置比 MySQL 的默认设置性能好得多。一旦正确配置了 InnoDB,您就可以进行同类比较了。