LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2830|回复: 0

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

[复制链接]
发表于 2009-5-8 16:07:55 | 显示全部楼层 |阅读模式

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

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

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

  9. MySQL服务器采用了多层设计和独立模块
  10. ...(省去5000字)
复制代码

第二 PostgreSQL

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

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

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

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

  17. ...(此处也省去5000字)
复制代码


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


  1. ./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
  2. make
  3. make install
复制代码


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

  1. ./configure --enable-FEATURE --enable-thread-safety
  2. gmake
  3. gmake install
复制代码


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

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

错误


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

  1. checking for PostgreSQL support for PDO... yes
  2. checking for pg_config... not found
  3. 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/"

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

  8. 80021     if test "$PHP_PGSQL" = "yes"; then
  9. 80022       PGSQL_SEARCH_PATHS="/usr /usr/local /usr/local/pgsql/bin"
  10. 80023     else
  11. 80024       PGSQL_SEARCH_PATHS=$PHP_PGSQL
  12. 80025     fi

复制代码

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

  7. ...
  8. 80021     if test "$PHP_PGSQL" = "yes"; then
  9. 80022       PGSQL_SEARCH_PATHS="/usr /usr/local /usr/local/postgres/bin"
  10. 80023     else
  11. 80024       PGSQL_SEARCH_PATHS=$PHP_PGSQL
  12. 80025     fi
复制代码


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


  1. $ export PGSQL_INCLUDE=/usr/local/postgres/include
  2. $ export PGSQL_LIBDIR=/usr/local/postgres/lib

  3. ...

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

复制代码


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



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


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

  2. ---MyISAM
  3. CREATE TABLE IF NOT EXISTS  uchome_docomment  (
  4.    id  int(10) unsigned NOT NULL AUTO_INCREMENT,
  5.    upid  int(10) unsigned NOT NULL DEFAULT '0',
  6.    doid  mediumint(8) unsigned NOT NULL DEFAULT '0',
  7.    uid  mediumint(8) unsigned NOT NULL DEFAULT '0',
  8.    username  char(15) NOT NULL DEFAULT '',
  9.    dateline  int(10) unsigned NOT NULL DEFAULT '0',
  10.    message  text NOT NULL,
  11.    ip  char(20) NOT NULL DEFAULT '',
  12.    grade  smallint(6) unsigned NOT NULL DEFAULT '0',
  13.   PRIMARY KEY ( id ),
  14.   KEY  doid  ( doid )
  15. ) ENGINE=MyISAM ;


  16. ---innodb
  17. CREATE TABLE IF NOT EXISTS  uchome_docomment_innodb  (
  18.    id  int(10) unsigned NOT NULL AUTO_INCREMENT,
  19.    upid  int(10) unsigned NOT NULL DEFAULT '0',
  20.    doid  mediumint(8) unsigned NOT NULL DEFAULT '0',
  21.    uid  mediumint(8) unsigned NOT NULL DEFAULT '0',
  22.    username  char(15) NOT NULL DEFAULT '',
  23.    dateline  int(10) unsigned NOT NULL DEFAULT '0',
  24.    message  text NOT NULL,
  25.    ip  char(20) NOT NULL DEFAULT '',
  26.    grade  smallint(6) unsigned NOT NULL DEFAULT '0',
  27.   PRIMARY KEY ( id ),
  28.   KEY  doid  ( doid )
  29. ) ENGINE=InnoDB ;

复制代码



  1. --  PostgreSQL 使用专有的存贮格式,目前只有一种
  2. CREATE TABLE  uchome_docomment (
  3.   id serial,
  4.   upid integer NOT NULL DEFAULT '0',
  5.   doid integer  NOT NULL DEFAULT '0',
  6.   uid integer  NOT NULL DEFAULT '0',
  7.   username char(15) NOT NULL DEFAULT '',
  8.   dateline integer NOT NULL DEFAULT '0',
  9.   message text NOT NULL,
  10.   ip char(20) NOT NULL DEFAULT '',
  11.   grade integer NOT NULL DEFAULT '0',
  12.   PRIMARY KEY (id,doid)
  13. )  ;

复制代码



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

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


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

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

第一会合简单的过去了,接下来就得用PHP来测试select insert update delete 这些常用的操
好时间到,欲知后事如何,请看第二节
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表