FreeDiscuz!'s Archiver

ydxiao 发表于 2010-1-28 14:47

把所有版块的最新帖子聚集到一个新版块,速度要慢很多,有没有办法优化呢?

集合到一个新版块是想做一个版块为大杂烩,
我把forumdisplay.php里面的where fid = XXX  之类的改成了 where fid NOT IN(XXX)  XXX为不想显示在大杂烩的帖子的版块fid号。

发现查询慢了很多,对比了自带的search.php,速度上是天差地别。请问要如何优化呢?以最小的改动实现这个功能,列表版面跟其它普通的版块在样式上要一致。
查询的条件可以只查几周或几个月以内的数据,这样会不会快点?

还有就是默认的where fid = XXX  版块里面的数据也不少呀,怎么速度跟我改后的相差那么多呢?

改前:Processed in 0.063857 second(s), 6 queries, Gzip enabled.
改后:Processed in 0.876123 second(s), 7 queries, Gzip enabled.  新增的一条查询跟页码有关。

horseluke 发表于 2010-1-28 21:08

把你改过和新增的sql贴出来~
估计mysql用了range进行索引查询

ydxiao 发表于 2010-1-28 23:29

回复 2# horseluke 的帖子

这段SQL不记得了是谁发的,好像是楼上发的。就是那个母版块同时显示子版块帖子标题的。
简单点来说我只能把里面的WHERE XX IN 改为了 WHERE XX NOT IN

horseluke 发表于 2010-1-29 15:35

假如通过not in剩下来的fid列表里面,那些板块的主题帖子有许多,那是肯定会拖速度的。

而至于自带的search.php,那只是你的幻觉。因为它搜索后会对其进行缓存(这也是现在绝大部分有搜索功能的的系统——不管什么编程语言、什么用途——都会采取的方式),然后以后就根据searchid来读取缓存(留意下面的链接)。


[quote]hxxp://www.freediscuz.net/bbs/search.php?[color=Red]searchid=2[/color]&orderby=lastpost&ascdesc=desc&searchsubmit=yes[/quote]

[[i] 本帖最后由 horseluke 于 2010-1-29 15:36 编辑 [/i]]

horseluke 发表于 2010-1-29 15:39

[quote]还有就是默认的where fid = XXX  版块里面的数据也不少呀,怎么速度跟我改后的相差那么多呢?[/quote]

这个是直接的fid定位(没猜错,mysql应该是采取const方式查找),你改成了not in,那就是让mysql采取range方式查找;再加上其它板块的数据量可能更多(特别是集合过后的fid列表),那就肯定死翘翘了:lol

======================================
综上,最便捷的解决方法只有一个,那就是:用缓存;P

[[i] 本帖最后由 horseluke 于 2010-1-29 15:42 编辑 [/i]]

ydxiao 发表于 2010-1-29 16:04

回复 5# horseluke 的帖子

缓存好是好,但却不能即时得到最新的内容。难不成还要让发帖的时候加多一个追加此缓存数据的功能

WHERE IN 与 WHERE NOT IN 的效率相差很大吗?在同等数据条件下。

horseluke 发表于 2010-1-29 22:11

[quote]原帖由 [i]ydxiao[/i] 于 2010-1-29 16:04 发表 [url=http://www.freediscuz.net/bbs/redirect.php?goto=findpost&pid=33973&ptid=5689][img]http://www.freediscuz.net/bbs/images/common/back.gif[/img][/url]
缓存好是好,但却不能即时得到最新的内容。难不成还要让发帖的时候加多一个追加此缓存数据的功能
[/quote]
假如你程序写得好,这完全不是问题。事实上也有程序/框架这么干的。


[quote]
WHERE IN 与 WHERE NOT IN 的效率相差很大吗?在同等数据条件下。 [/quote]

不是这个问题啊
是和你最终查询的板块,究竟有多少贴有关~

[[i] 本帖最后由 horseluke 于 2010-1-29 22:25 编辑 [/i]]

horseluke 发表于 2010-1-29 22:12

要不你加我QQ聊好了~

ydxiao 发表于 2010-1-30 14:30

回复 7# horseluke 的帖子

看来想利用好此功能也只有写进缓存里了。
我是一个地方站,已经让我改得面目全非了。还停留在6.1,如果想升级的话,应该麻烦很多,要改的地方太多。所以也没有跟差官网的步伐走。

还有就是我前段时间写了一段实时的帖数显示,今日每增一张新帖,首页上显示的帖数自动加上去。

我是这样子写的,先缓存一个今日帖数的数据文件,里面只有一个数字,就是今日的帖数,发帖的时候这个文件的数字+1,页首页的显示也是读取这个文件里的数字,显示的时候我用JS每2秒刷新一次数字。

我把访客每刷新一个页面也另做了一个数据,同理显示。

但还是发现有问题,程序我应该没有写错,因为开始还是显示很正常的,可以实时更新显示。可后来这个数字就乱了,回到了0,再加之,等于是初始显示。
我重复检查了很多次程序,也没有发现问题。
我现在会不会是这样的问题,因为访客刷新页面的次数很多,写数据的时候跟读数据有冲突的可能,导至读不到数据,所以初始了。

有没有这种可能????

说了一大堆 ,不能看客是否看懂。

先谢过之前的解答。

horseluke 发表于 2010-1-30 21:21

回复 9# ydxiao 的帖子

dz本身就有啊:
[quote]今日: 6, 昨日: 7, 最高日: 308   [/quote]

有必要么?


====================
另外对于:
[quote]我现在会不会是这样的问题,因为访客刷新页面的次数很多,写数据的时候跟读数据有冲突的可能,导至读不到数据,所以初始了。[/quote]
是有这个可能的。解决方法是让写数据的时候使用文件独占锁,方法为:
如果你使用file_put_contents,并且PHP版本为5.1.0以上,那就这么写:[code]file_put_contents('filename.txt', 'file content', LOCK_EX)[/code]其它版本的话:[code]$fp = fopen('debug.txt', 'w');
flock($fp, LOCK_EX);
fwrite($fp, $data);
fclose($fp); [/code]

[[i] 本帖最后由 horseluke 于 2010-1-30 21:35 编辑 [/i]]

ydxiao 发表于 2010-1-30 23:06

回复 10# horseluke 的帖子

是有这个可能的。解决方法是让写数据的时候使用文件独占锁,方法为:

我使用了你提到的后者:兼容模式。看过段时间会不会有问题。

horseluke 发表于 2010-1-31 12:02

回复 11# ydxiao 的帖子

始终觉得你这个功能,频繁的读写会对磁盘产生一定的影响

如果你是独立主机,建议加一些缓存组件,比如memcache,xcache,apc等等

ydxiao 发表于 2010-2-1 17:25

回复 12# horseluke 的帖子

服务器还在使用IIS搭的PHP,用哪个缓存组件好些呢?

页: [1]

Powered by Discuz! Archiver 6.1.0F  © 2001-2007 Comsenz Inc.