把所有版块的最新帖子聚集到一个新版块,速度要慢很多,有没有办法优化呢?
集合到一个新版块是想做一个版块为大杂烩,我把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. 新增的一条查询跟页码有关。 把你改过和新增的sql贴出来~
估计mysql用了range进行索引查询
回复 2# horseluke 的帖子
这段SQL不记得了是谁发的,好像是楼上发的。就是那个母版块同时显示子版块帖子标题的。简单点来说我只能把里面的WHERE XX IN 改为了 WHERE XX NOT IN 假如通过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]] [quote]还有就是默认的where fid = XXX 版块里面的数据也不少呀,怎么速度跟我改后的相差那么多呢?[/quote]
这个是直接的fid定位(没猜错,mysql应该是采取const方式查找),你改成了not in,那就是让mysql采取range方式查找;再加上其它板块的数据量可能更多(特别是集合过后的fid列表),那就肯定死翘翘了:lol
======================================
综上,最便捷的解决方法只有一个,那就是:用缓存;P
[[i] 本帖最后由 horseluke 于 2010-1-29 15:42 编辑 [/i]]
回复 5# horseluke 的帖子
缓存好是好,但却不能即时得到最新的内容。难不成还要让发帖的时候加多一个追加此缓存数据的功能WHERE IN 与 WHERE NOT IN 的效率相差很大吗?在同等数据条件下。 [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]] 要不你加我QQ聊好了~
回复 7# horseluke 的帖子
看来想利用好此功能也只有写进缓存里了。我是一个地方站,已经让我改得面目全非了。还停留在6.1,如果想升级的话,应该麻烦很多,要改的地方太多。所以也没有跟差官网的步伐走。
还有就是我前段时间写了一段实时的帖数显示,今日每增一张新帖,首页上显示的帖数自动加上去。
我是这样子写的,先缓存一个今日帖数的数据文件,里面只有一个数字,就是今日的帖数,发帖的时候这个文件的数字+1,页首页的显示也是读取这个文件里的数字,显示的时候我用JS每2秒刷新一次数字。
我把访客每刷新一个页面也另做了一个数据,同理显示。
但还是发现有问题,程序我应该没有写错,因为开始还是显示很正常的,可以实时更新显示。可后来这个数字就乱了,回到了0,再加之,等于是初始显示。
我重复检查了很多次程序,也没有发现问题。
我现在会不会是这样的问题,因为访客刷新页面的次数很多,写数据的时候跟读数据有冲突的可能,导至读不到数据,所以初始了。
有没有这种可能????
说了一大堆 ,不能看客是否看懂。
先谢过之前的解答。
回复 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]]
回复 10# horseluke 的帖子
是有这个可能的。解决方法是让写数据的时候使用文件独占锁,方法为:我使用了你提到的后者:兼容模式。看过段时间会不会有问题。
回复 11# ydxiao 的帖子
始终觉得你这个功能,频繁的读写会对磁盘产生一定的影响如果你是独立主机,建议加一些缓存组件,比如memcache,xcache,apc等等
回复 12# horseluke 的帖子
服务器还在使用IIS搭的PHP,用哪个缓存组件好些呢?页:
[1]