免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: osdba

PostgreSQL与MySQL比较 [复制链接]

论坛徽章:
3
数据库技术版块每日发帖之星
日期:2015-06-18 22:20:00数据库技术版块每日发帖之星
日期:2015-06-21 22:20:00数据库技术版块每日发帖之星
日期:2015-08-27 06:20:00
发表于 2011-02-23 10:33 |显示全部楼层
本帖最后由 osdba 于 2011-02-23 10:36 编辑

这个更新慢的问题仅存在于你这种做测试的这个特殊场景中。一般的业务情况下,这个问题是不存在的,只要不在你这个特殊的测试场景中,PostgreSQL更新是很快的。

我前面写的原因,你可能没有仔细看,这里再做一个详细说明:

慢的原因是你在一个事务中多次对同一条数据进行更新,而对这同一条记录的更新,而你一直不提交,导致vacuum一直不能对这个表做清理,于是后面的更新时,需要找到当前最新版本的记录时花了很长时间。如果你更新100条就提交一次,这样就有可能让vacuum来整理这个表的多版本数据,那么后面更新也会快很多。当然如果你的表中是有很多条记录,如10000条记录,表上再有索引时,每次更新时都是选不同的记录时,这样找到要更新的记录会很快,那么这样的更新也是会很快的。

见我下面的测试:
我先建两个表sno1和sno2,表sno1中只有一条数据,而sno2中有10000条数据,对sno1更新100000次,而对sno2表也更新100000次,但由于sno2有10000条记录,所有每条记录只更新了10次,下面的测试可以看到对sno1的更新很慢,花了169秒,而对sno2的更新只花了4.5秒:

create table sno1(sno int );
insert into sno1 values(1);
create or replace function updatetest1() RETURNS VOID AS
$$
declare
i  int;
BEGIN
    i := 1;
    while i <= 100000 loop
        update  sno1  set sno = sno +1;
        i := i + 1;
    end loop;
end;
$$
LANGUAGE plpgsql;


create table sno2(id int primary key,sno int );

insert into sno2 select generate_series(1,10000),1;

create or replace function updatetest2() RETURNS VOID AS
$$
declare
i  int;
n  int;
BEGIN
    i := 1;
    n := 1;
    while i <= 100000 loop
        update  sno2  set sno = sno +1 where id=n;
        i := i + 1;
        n := n + 1;
        IF n> 10000 THEN
            n := 1;
        END IF;
    end loop;
end;
$$
LANGUAGE plpgsql;

osdba=# select updatetest1();
updatetest1
-------------

(1 row)

Time: 169260.575 ms
osdba=# select updatetest2();
updatetest2
-------------

(1 row)

Time: 4544.237 ms
osdba=#

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
发表于 2011-02-23 14:41 |显示全部楼层
谢谢osdba兄精准,深刻的分析,解决了困扰我好久的问题,

说明POSTGRES在速度方面不比MYSQL和ORACLE等数据库差。


谢谢!

论坛徽章:
3
数据库技术版块每日发帖之星
日期:2015-06-18 22:20:00数据库技术版块每日发帖之星
日期:2015-06-21 22:20:00数据库技术版块每日发帖之星
日期:2015-08-27 06:20:00
发表于 2011-04-21 16:21 |显示全部楼层
今天又增加了MySQL相对PostgreSQL的一些劣势分析。

论坛徽章:
0
发表于 2011-04-22 20:02 |显示全部楼层
  PostgreSQL9.0中的特色功能:   
    PostgreSQL中的Hot Standby功能
    也就是standby在应用日志同步时,还可以提供只读服务,这对做读写分离很有用。这个功能是oracle11g才有的功能。

呵呵,这个oracle 10g就实现了啊,逻辑dg就可以,物理dg主要用来做灾备的,做迁移对于特定的环境中也是个不错的选择。

论坛徽章:
0
发表于 2011-04-27 17:04 |显示全部楼层
留名

论坛徽章:
0
发表于 2011-05-16 13:58 |显示全部楼层
我看过的比较MySQL和PostgreSQL最详细的帖子,楼主确实是高手,研究透彻。佩服

论坛徽章:
0
发表于 2012-02-29 07:52 |显示全部楼层
谢谢。已右键

论坛徽章:
0
发表于 2012-03-08 10:21 |显示全部楼层
楼主研究的透彻,postgresql确实不错,我最近也比较倾向于postgresql了

论坛徽章:
2
技术图书徽章
日期:2013-12-20 07:35:03技术图书徽章
日期:2014-12-16 12:59:42
发表于 2012-03-09 21:53 |显示全部楼层
多谢

论坛徽章:
0
发表于 2012-03-21 15:58 |显示全部楼层
非常好,又学习了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP