PostgreSQL 与 MySQL:性能差异巨大

PostgreSQL 与 MySQL:性能差异巨大

我们使用 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,您就可以进行同类比较了。

相关内容