PostgreSQL 与 MySQL 性能大测试(是不是比多了)

vyouzhi 2009-05-08 04:38:55

看到N多人比较这两个数据库,呵呵,我也来搞搞热闹,希望接下来都尽可能在应用角度去测试这次比较
本测试文档,采用GPL 协议,如转载请注明出处 : http://blog.bowenye.com/read.php?2
如商业,请联系本人 QQ : 84437129

测试项目将分多个,比如安装过程,建表,select delete, 针对MySQL不同的存贮格式,容错等各方面,更可能做到国内最详尽比较
先来介绍一下两个主角
第一 MySQL

先来收集几个官方的描述
MySQL AB是由MySQL创始人和主要开发人创办的公司。MySQL AB最初是由David Axmark、Allan Larsson和Michael“Monty”Widenius在瑞典创办的.
*MySQL是一种数据库管理系统
*MySQL是一种关联数据库管理系统。
*MySQL软件是一种开放源码软件。
*MySQL数据库服务器具有快速、可靠和易于使用的特点。
*MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中。
*有大量可用的共享MySQL软件。

MySQL服务器采用了多层设计和独立模块
...(省去5000字)

第二 PostgreSQL

PostgreSQL 是以加州大学伯克利分校计算机系开发的 POSTGRES, Version 4.2 为基础的对象关系型数据库管理系统(ORDBMS)。POSTGRES 领先的许多概念只是在非常迟的时候才出现在商业数据库中。

PostgreSQL 是最初伯克利代码的一个开放源码的继承人。它支持大部分 SQL 标准并且提供了许多其它现代特性:

复杂查询
外键
触发器
视图
事务完整性
多版本并发控制
另外,PostgreSQL 可以用许多方法进行扩展,比如通过增加新的:

数据类型
函数
操作符
聚集函数
索引方法
过程语言
并且,因为许可证的灵活,任何人都可以以任何目的免费使用、修改、分发 PostgreSQL ,不管是私用、商用、还是学术研究使用。

...(此处也省去5000字)


呵呵,费话有点多了,现在就马上开始(已经有人开始拿鸡蛋了)
(注意,以下内容我会有意做错一点的,主要是为了防止ctrl+v的垢病,但又绝对不影响学习,当你动动手实践了你就明,我倒底在哪儿有意做错的了 :p )
1.mysql 编译参数
MySQL编译参数,因为MySQL有多种不同的存贮格式,现在取两种常用的MyISAM 与 innodb 版本 mysql-5.1.34


./configure --prefix=/usr/local/mysql --with-extra-charsets=all --enable-thread-safe-client --enable-shared --enable-static --with-comment --with-man --with-docs --with-pthread --enable-assembler --with-mysqld-ldflags=-all-static --with-plugins=innobase
make
make install


2.PostgreSQL 编译参数
PostgreSQL比较简单 版本 postgresql-8.3.6 如果有人需要最新的,请到我提供的国内镜像下载

./configure --enable-FEATURE --enable-thread-safety
gmake
gmake install


使用 默认的 my-large.cnf 作为my.cnf文件
mysql 5.1.x的一个不太友好的地方,my.cnf默认的文件都得把里面一行
skip-federated

大概在50行上面注释掉
否则在启动时会出现
Starting MySQL.Manager of pid-file quit without updating fi[FAILED]

错误


题外话,在编译php增加pgsql参数的时候,如果你的pgsql用rpm安装的呢,倒不会遇到啥问题,但如果pgsql是用源代码安装并安装在自己重新设定的文件夹上面的呢
一般都会出现如下的错误

checking for PostgreSQL support for PDO... yes
checking for pg_config... not found
configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path

要解决的方法有两个
一. 在PHP源代码第80002-80025行代码中修改"/usr/local/pgsql/bin" 为你安装PostgreSQL的文件夹,如"/usr/local/postgres/bin/"

原始代码
80002 for i in $PHP_PGSQL $PHP_PGSQL/bin /usr/local/pgsql/bin /usr/local/bin /usr/bin ""; do
80003 if test -x $i/pg_config; then
80004 PG_CONFIG="$i/pg_config"
80005 break;
80006 fi
...

80021 if test "$PHP_PGSQL" = "yes"; then
80022 PGSQL_SEARCH_PATHS="/usr /usr/local /usr/local/pgsql/bin"
80023 else
80024 PGSQL_SEARCH_PATHS=$PHP_PGSQL
80025 fi



修改后代码
80002 for i in $PHP_PGSQL $PHP_PGSQL/bin /usr/local/postgres/bin/ /usr/local/bin /usr/bin ""; do
80003 if test -x $i/pg_config; then
80004 PG_CONFIG="$i/pg_config"
80005 break;
80006 fi

...
80021 if test "$PHP_PGSQL" = "yes"; then
80022 PGSQL_SEARCH_PATHS="/usr /usr/local /usr/local/postgres/bin"
80023 else
80024 PGSQL_SEARCH_PATHS=$PHP_PGSQL
80025 fi


二.运行 export 命令重新定位 就行


$ export PGSQL_INCLUDE=/usr/local/postgres/include
$ export PGSQL_LIBDIR=/usr/local/postgres/lib

...

--with-pdo-pgsql=/usr/local/postgres/ --with-pgsql=/usr/local/postgres/



(注意上面的问题在国内应该还没人提出,国外我google了一下,才只有一两编文章说到这事,可能用PostgreSQL的人太少了)



OK,开始建表,为了标准化,两种数据库的表都尽可能相同
基于理论源于生活,理论用于生活的至高名言,决定采用UCHOME 1.5的一个表(如果实在不知这是啥表的人,不要来问我)


---MySQL 的一个表,MySQL正常情况会分myisam 与innodb 所以在建表的时候,为公平,再多建一个innodb

---MyISAM
CREATE TABLE IF NOT EXISTS uchome_docomment (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
upid int(10) unsigned NOT NULL DEFAULT '0',
doid mediumint(8) unsigned NOT NULL DEFAULT '0',
uid mediumint(8) unsigned NOT NULL DEFAULT '0',
username char(15) NOT NULL DEFAULT '',
dateline int(10) unsigned NOT NULL DEFAULT '0',
message text NOT NULL,
ip char(20) NOT NULL DEFAULT '',
grade smallint(6) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY ( id ),
KEY doid ( doid )
) ENGINE=MyISAM ;


---innodb
CREATE TABLE IF NOT EXISTS uchome_docomment_innodb (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
upid int(10) unsigned NOT NULL DEFAULT '0',
doid mediumint(8) unsigned NOT NULL DEFAULT '0',
uid mediumint(8) unsigned NOT NULL DEFAULT '0',
username char(15) NOT NULL DEFAULT '',
dateline int(10) unsigned NOT NULL DEFAULT '0',
message text NOT NULL,
ip char(20) NOT NULL DEFAULT '',
grade smallint(6) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY ( id ),
KEY doid ( doid )
) ENGINE=InnoDB ;





-- PostgreSQL 使用专有的存贮格式,目前只有一种
CREATE TABLE uchome_docomment (
id serial,
upid integer NOT NULL DEFAULT '0',
doid integer NOT NULL DEFAULT '0',
uid integer NOT NULL DEFAULT '0',
username char(15) NOT NULL DEFAULT '',
dateline integer NOT NULL DEFAULT '0',
message text NOT NULL,
ip char(20) NOT NULL DEFAULT '',
grade integer NOT NULL DEFAULT '0',
PRIMARY KEY (id,doid)
) ;




OK,表建好了,现在准备测试方案

来了,马上接受第一个测试,建表时间,(注意,不能说很有参考性,也不能说能这个测试能帮你啥大忙)


由于MySQL只能到0.00秒内,所以只在phpmyadmin上面运行了一下
时间平均在0.0003 秒 至 0.0005 秒:

而PostgreSQL 时间在 Time: 12.006 ms 至 Time: 14.703 ms

第一会合简单的过去了,接下来就得用PHP来测试select insert update delete 这些常用的操
好时间到,欲知后事如何,请看第二节
...全文
536 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
vyouzhi 2009-05-08
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ACMAIN_CHM 的回复:]
另外建议能以表的形式来显示你的对比结果。

BatchFile code| MySQL | PostgreSQL
--------------+---------+--------+-------------
| MyISAM | InnoDB | xxx
--------------+---------+--------+-------------
creae table |0.0003| |12.006select| | |
delete | | |
update | | |
--------------+---------+--------+----…
[/Quote]

多谢提点,将会在第二节中改正
ACMAIN_CHM 2009-05-08
  • 打赏
  • 举报
回复

没办法CSDN的限制比较多,或许你可以发到你的博客中做个系列。然后在这发个链接。
vyouzhi 2009-05-08
  • 打赏
  • 举报
回复
e~~~ 竟然也能修改的, -_-! 第一次发贴子,不要怪
ACMAIN_CHM 2009-05-08
  • 打赏
  • 举报
回复

另外建议能以表的形式来显示你的对比结果。

[code=BatchFile] | MySQL | PostgreSQL
--------------+---------+--------+-------------
| MyISAM | InnoDB | xxx
--------------+---------+--------+-------------
creae table | 0.0003 | | 12.006
select | | |
delete | | |
update | | |
--------------+---------+--------+-------------[/code]

vyouzhi 2009-05-08
  • 打赏
  • 举报
回复
会了,呵呵,现在重新发一次
vyouzhi 2009-05-08
  • 打赏
  • 举报
回复
 
看到N多人比较这两个数据库,呵呵,我也来搞搞热闹,希望接下来都尽可能在应用角度去测试这次比较
本测试文档,采用GPL 协议,如转载请注明出处 : http://blog.bowenye.com/read.php?2
如商业,请联系本人 QQ : 84437129

测试项目将分多个,比如安装过程,建表,select delete, 针对MySQL不同的存贮格式,容错等各方面,更可能做到国内最详尽比较
先来介绍一下两个主角
第一 MySQL
 
先来收集几个官方的描述
MySQL AB是由MySQL创始人和主要开发人创办的公司。MySQL AB最初是由David Axmark、Allan Larsson和Michael“Monty”Widenius在瑞典创办的.
*MySQL是一种数据库管理系统
*MySQL是一种关联数据库管理系统。
*MySQL软件是一种开放源码软件。
*MySQL数据库服务器具有快速、可靠和易于使用的特点。
*MySQL服务器工作在客户端/服务器模式下,或嵌入式系统中。
*有大量可用的共享MySQL软件。

MySQL服务器采用了多层设计和独立模块
...(省去5000字)

第二 PostgreSQL
 
PostgreSQL 是以加州大学伯克利分校计算机系开发的 POSTGRES, Version 4.2 为基础的对象关系型数据库管理系统(ORDBMS)。POSTGRES 领先的许多概念只是在非常迟的时候才出现在商业数据库中。

PostgreSQL 是最初伯克利代码的一个开放源码的继承人。它支持大部分 SQL 标准并且提供了许多其它现代特性:

复杂查询
外键
触发器
视图
事务完整性
多版本并发控制
另外,PostgreSQL 可以用许多方法进行扩展,比如通过增加新的:

数据类型
函数
操作符
聚集函数
索引方法
过程语言
并且,因为许可证的灵活,任何人都可以以任何目的免费使用、修改、分发 PostgreSQL ,不管是私用、商用、还是学术研究使用。

...(此处也省去5000字)


呵呵,费话有点多了,现在就马上开始(已经有人开始拿鸡蛋了)
(注意,以下内容我会有意做错一点的,主要是为了防止ctrl+v的垢病,但又绝对不影响学习,当你动动手实践了你就明,我倒底在哪儿有意做错的了 :p )
1.mysql 编译参数
MySQL编译参数,因为MySQL有多种不同的存贮格式,现在取两种常用的MyISAM 与 innodb 版本 mysql-5.1.34

 
./configure --prefix=/usr/local/mysql --with-extra-charsets=all --enable-thread-safe-client --enable-shared --enable-static --with-comment --with-man --with-docs --with-pthread --enable-assembler --with-mysqld-ldflags=-all-static --with-plugins=innobase
make
make install


2.PostgreSQL 编译参数
PostgreSQL比较简单 版本 postgresql-8.3.6 如果有人需要最新的,请到我提供的国内镜像下载
 
./configure --enable-FEATURE --enable-thread-safety
gmake
gmake install


使用 默认的 my-large.cnf 作为my.cnf文件
mysql 5.1.x的一个不太友好的地方,my.cnf默认的文件都得把里面一行
 skip-federated

大概在50行上面注释掉
否则在启动时会出现
 Starting MySQL.Manager of pid-file quit without updating fi[FAILED]

错误


题外话,在编译php增加pgsql参数的时候,如果你的pgsql用rpm安装的呢,倒不会遇到啥问题,但如果pgsql是用源代码安装并安装在自己重新设定的文件夹上面的呢
一般都会出现如下的错误
 
checking for PostgreSQL support for PDO... yes
checking for pg_config... not found
configure: error: Cannot find libpq-fe.h. Please specify correct PostgreSQL installation path

要解决的方法有两个
一. 在PHP源代码第80002-80025行代码中修改"/usr/local/pgsql/bin" 为你安装PostgreSQL的文件夹,如"/usr/local/postgres/bin/"
 
原始代码
80002 for i in $PHP_PGSQL $PHP_PGSQL/bin /usr/local/pgsql/bin /usr/local/bin /usr/bin ""; do
80003 if test -x $i/pg_config; then
80004 PG_CONFIG="$i/pg_config"
80005 break;
80006 fi
...

80021 if test "$PHP_PGSQL" = "yes"; then
80022 PGSQL_SEARCH_PATHS="/usr /usr/local /usr/local/pgsql/bin"
80023 else
80024 PGSQL_SEARCH_PATHS=$PHP_PGSQL
80025 fi


 
修改后代码
80002 for i in $PHP_PGSQL $PHP_PGSQL/bin /usr/local/postgres/bin/ /usr/local/bin /usr/bin ""; do
80003 if test -x $i/pg_config; then
80004 PG_CONFIG="$i/pg_config"
80005 break;
80006 fi

...
80021 if test "$PHP_PGSQL" = "yes"; then
80022 PGSQL_SEARCH_PATHS="/usr /usr/local /usr/local/postgres/bin"
80023 else
80024 PGSQL_SEARCH_PATHS=$PHP_PGSQL
80025 fi


二.运行 export 命令重新定位 就行
 

$ export PGSQL_INCLUDE=/usr/local/postgres/include
$ export PGSQL_LIBDIR=/usr/local/postgres/lib

...

--with-pdo-pgsql=/usr/local/postgres/ --with-pgsql=/usr/local/postgres/



(注意上面的问题在国内应该还没人提出,国外我google了一下,才只有一两编文章说到这事,可能用PostgreSQL的人太少了)



OK,开始建表,为了标准化,两种数据库的表都尽可能相同
基于理论源于生活,理论用于生活的至高名言,决定采用UCHOME 1.5的一个表(如果实在不知这是啥表的人,不要来问我)

 
---MySQL 的一个表,MySQL正常情况会分myisam 与innodb 所以在建表的时候,为公平,再多建一个innodb

---MyISAM
CREATE TABLE IF NOT EXISTS uchome_docomment (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
upid int(10) unsigned NOT NULL DEFAULT '0',
doid mediumint(8) unsigned NOT NULL DEFAULT '0',
uid mediumint(8) unsigned NOT NULL DEFAULT '0',
username char(15) NOT NULL DEFAULT '',
dateline int(10) unsigned NOT NULL DEFAULT '0',
message text NOT NULL,
ip char(20) NOT NULL DEFAULT '',
grade smallint(6) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY ( id ),
KEY doid ( doid )
) ENGINE=MyISAM ;


---innodb
CREATE TABLE IF NOT EXISTS uchome_docomment_innodb (
id int(10) unsigned NOT NULL AUTO_INCREMENT,
upid int(10) unsigned NOT NULL DEFAULT '0',
doid mediumint(8) unsigned NOT NULL DEFAULT '0',
uid mediumint(8) unsigned NOT NULL DEFAULT '0',
username char(15) NOT NULL DEFAULT '',
dateline int(10) unsigned NOT NULL DEFAULT '0',
message text NOT NULL,
ip char(20) NOT NULL DEFAULT '',
grade smallint(6) unsigned NOT NULL DEFAULT '0',
PRIMARY KEY ( id ),
KEY doid ( doid )
) ENGINE=InnoDB ;




 
-- PostgreSQL 使用专有的存贮格式,目前只有一种
CREATE TABLE uchome_docomment (
id serial,
upid integer NOT NULL DEFAULT '0',
doid integer NOT NULL DEFAULT '0',
uid integer NOT NULL DEFAULT '0',
username char(15) NOT NULL DEFAULT '',
dateline integer NOT NULL DEFAULT '0',
message text NOT NULL,
ip char(20) NOT NULL DEFAULT '',
grade integer NOT NULL DEFAULT '0',
PRIMARY KEY (id,doid)
) ;




OK,表建好了,现在准备测试方案

来了,马上接受第一个测试,建表时间,(注意,不能说很有参考性,也不能说能这个测试能帮你啥大忙)


由于MySQL只能到0.00秒内,所以只在phpmyadmin上面运行了一下
时间平均在0.0003 秒 至 0.0005 秒:

而PostgreSQL 时间在 Time: 12.006 ms 至 Time: 14.703 ms

第一会合简单的过去了,接下来就得用PHP来测试select insert update delete 这些常用的操
好时间到,欲知后事如何,请看第二节
ACMAIN_CHM 2009-05-08
  • 打赏
  • 举报
回复

不错,

这里可以用CODE

比如

select * from table


vyouzhi 2009-05-08
  • 打赏
  • 举报
回复
晕,这儿用不了CODE
WWWWA 2009-05-08
  • 打赏
  • 举报
回复
等下一节

56,678

社区成员

发帖
与我相关
我的任务
社区描述
MySQL相关内容讨论专区
社区管理员
  • MySQL
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧