Discuz!官方免费开源建站系统

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索

Discuz能有多快? 见识下postgreSQL的强悍,对比下mysql的低能

[复制链接]
whiskoy 发表于 2012-8-7 10:24:34 | 显示全部楼层
见识了!!
回复

使用道具 举报

netys 发表于 2012-8-7 10:56:35 | 显示全部楼层
真是好人啊~~
回复

使用道具 举报

bugx 发表于 2012-8-7 12:37:13 | 显示全部楼层
本帖最后由 bugx 于 2012-8-7 13:00 编辑
mark35 发表于 2012-8-6 16:27
1000万记录, innodb count(*) 估计要数十秒以上。这个时间本身倒不太恐怖,就当是个慢查询。但问题是在这 ...

就不能 count(pid)吗?非要count(*)
count(pid),不会超过3秒。因为post表已经改为myisam,所以我刚才拿 收藏表测试了一下,  6888377  ,600多万收藏。1-2秒左右。

SELECT COUNT( favid )
FROM `pre_home_favorite`

这种语句,在PgSQL里也不会很快的,包括MAX这种,都是遍历的。

Transactional databases which implement MVCC such as PostgreSQL and InnoDB perform COUNT(*) in a way that is very slow compared to non-transactional databases like MyISAM. The MyISAM engine in MySQL uses an index scan for COUNT(*) and also caches the result of the count, thus it is much faster. PostgreSQL and InnoDB require a table scan to locate all visible rows. These MVCC capable engines implement COUNT(*) this way because MVCC stores transaction visibility in the row data as opposed to the index. With MVCC capable databases, caching the COUNT(*) would result in incorrect data being returned. PostgreSQL 9.2 will have index-only scan support which uses the visibility map feature to determine whether a row is visible to the current transaction rather than visiting the page. This means dramatically faster COUNT(*) results.

况且这种都是可以做缓存的,根本不是什么性能瓶颈关键所在。这个真不会导致极端的现象。我用innoDB跑dz已经2年了,性能比myisam强大多了。升级2.5后,post表没有办法只能改为myisam。
facebook都有用到mysql,我们这些站长又担心什么。
回复

使用道具 举报

bugx 发表于 2012-8-7 12:38:51 | 显示全部楼层
mark35 发表于 2012-8-6 16:32
是啊,论坛就是个留言板,搞这么多功能,搞什么积分、充值、兑换干嘛呢?
什么?会员积分和RMB关联, ...

你说的这种很极端,把网站的积分系统要和金融系统的安全性和数据完整性比是不可比的。
那登录和积分交易都要走https了,而不是光数据库问题了。
回复

使用道具 举报

 楼主| mark35 发表于 2012-8-7 13:41:53 | 显示全部楼层
本帖最后由 mark35 于 2012-12-3 20:55 编辑
bugx 发表于 2012-8-7 12:37
就不能 count(pid)吗?非要count(*)
count(pid),不会超过3秒。因为post表已经改为myisam,所以我刚才拿 ...
就不能 count(pid)吗?非要count(*)
count(pid),不会超过3秒。因为post表已经改为myisam,所以我刚才拿 收藏表测试了一下,  6888377  ,600多万收藏。1-2秒左右。

SELECT COUNT( favid ) FROM `pre_home_favorite`

为啥posts不继续用innodb呢

我这儿470万记录的posts表,pg下 count(*) 需要12秒。如果是innodb也不可能一两秒的速度。不过我其实也修改了代码没有做全表count,因为pg的系统表 pg_class 中保存着所有用户表的记录总数(非实时),在需要表总行数时我直接读取那儿即可。无需专门写代码来缓存这个值

ps, count(*) 和 count(column) 有细微差别
回复

使用道具 举报

 楼主| mark35 发表于 2012-8-7 13:48:27 | 显示全部楼层
本帖最后由 mark35 于 2012-12-3 20:55 编辑
bugx 发表于 2012-8-7 12:38
你说的这种很极端,把网站的积分系统要和金融系统的安全性和数据完整性比是不可比的。
那登录和积分交易 ...

我这个所谓极端是有上下文关系的,是针对我回复的那个帖子所言。

再说论坛是什么呢,就是个留言板,要ACID做什么呢?myisam本身就不支持这玩意

要这么说数据库都还是个留言板呢
回复

使用道具 举报

bugx 发表于 2012-8-7 14:08:02 | 显示全部楼层
本帖最后由 bugx 于 2012-8-7 14:09 编辑
mark35 发表于 2012-8-7 13:41
为啥posts不继续用innodb呢

我这儿470万记录的posts表,pg下 count(*) 需要12秒。如果是innodb也不可 ...

post表在2.5里被dz改了结构,无法使用innoDB。

你试试count(pid)呢

sql语句可以优化下啊,能select一个字段的,绝不select全部字段。在写代码的还是不是也这样吗?

你再看下这段英文

Transactional databases which implement MVCC such as PostgreSQL and InnoDB perform COUNT(*) in a way that is very slow compared to non-transactional databases like MyISAM. The MyISAM engine in MySQL uses an index scan for COUNT(*) and also caches the result of the count, thus it is much faster. PostgreSQL and InnoDB require a table scan to locate all visible rows. These MVCC capable engines implement COUNT(*) this way because MVCC stores transaction visibility in the row data as opposed to the index. With MVCC capable databases, caching the COUNT(*) would result in incorrect data being returned. PostgreSQL 9.2 will have index-only scan support which uses the visibility map feature to determine whether a row is visible to the current transaction rather than visiting the page. This means dramatically faster COUNT(*) results.

回复

使用道具 举报

 楼主| mark35 发表于 2012-8-7 14:14:33 | 显示全部楼层
本帖最后由 mark35 于 2012-12-3 20:55 编辑
bugx 发表于 2012-8-7 14:08
post表在2.5里被dz改了结构,无法使用innoDB。

你试试count(pid)呢

呵呵,我明白为啥你那儿1-2秒了。

刚才在pg上面 SELECT count(pid) FROM cdb_posts;
第一次9.3s,第二次2.1s。
你那儿的1-2秒肯定是缓存的结果而不是冷查询的结果啦~

接着我又执行 SELECT count(*) FROM cdb_posts; 时间是 1.6s, 比count(pid)还要快!

这就是我上面说的 count(*) 和 count(pid) 的细微差别的结果:
count(*) 是计算表记录所有行,不区分NULL值
count(colunm) 需要判断非NULL值,多了个取值-判断的步骤,会比前者开销大那么一点点~~~
回复

使用道具 举报

 楼主| mark35 发表于 2012-8-7 14:20:25 | 显示全部楼层
本帖最后由 mark35 于 2012-8-7 14:22 编辑
bugx 发表于 2012-8-7 14:08
post表在2.5里被dz改了结构,无法使用innoDB。

你试试count(pid)呢

【选择InnoDB还是MYISAM?数据库lock进程的困扰】
https://discuz.dismall.com/thread-1927887-1-1.html

官方太保守了。你走在了官方前面。
回复

使用道具 举报

bugx 发表于 2012-8-7 14:42:53 | 显示全部楼层
mark35 发表于 2012-8-7 14:14
呵呵,我明白为啥你那儿1-2秒了。

刚才在pg上面 SELECT count(pid) FROM cdb_posts;

pqSQL的这个机制应该和innoDB是一样的。count都不是其强项。但是这些都是可以通过程序来弥补的。官方会考虑产品的适用性和环境的普及度,语言和数据库的市场占有率。

所以讨论另一个数据库就好比讨论让dz换PHP为python开发一样,没什么意义。在现有的基础上改改是最可靠的方法。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|Discuz! 官方站 ( 皖ICP备16010102号 )star

GMT+8, 2024-12-27 15:44 , Processed in 0.041734 second(s), 3 queries , Gzip On, Redis On.

Powered by Discuz! X3.4

Copyright © 2001-2023, Tencent Cloud.

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