首先,问题的来源是樱町论坛(下面简称YT)。YT的数据库大小在很久以前就已经超过了200M,现在已经达到差不多300M了。帖子数据表现在有3个,Dv_bbs1有大约13万条记录,Dv_bbs2有大约14万条记录,Dv_bbs3最近才开始使用的,截止到现在有1万多条记录。虽然说使用着Dv_bbs3数据表,只要不翻旧帖子,就不会用到Dv_bbs1和Dv_bbs2数据表,但是这两个数据表为整个数据库“贡献”了大约190M的大小(这是后面我把这两个数据表导出来以后知道的),而一个Access数据库体积太大的话会对其运行造成影响的。YT的情况是页面执行时间比以前下降了很多,现在基本上执行一个页面都要0.1秒以上,而以前几乎都是0.0x秒就能执行一个页面的。同时,现在的在线人数和以前的在线人数相差不大,页面执行时间就是这样被数据库给拖下来的,服务器负担就是这样给数据库加重的,论坛运行就是这样给数据库搞得不稳定的,经常SU(Service Unavailable)。
如果能把数据库的体积减小,执行的效率就会提高了嘛,服务器负担就会减轻了嘛,论坛运行也就会更稳定了嘛,SU也就会少很多了嘛。
至于怎么办,办法就是把Dv_bbs1和Dv_bbs2分离出来。因为Dv_bbs1和Dv_bbs2这两个数据表当前并没有使用,所以只要不去翻旧帖,一般就不会去访问这两个数据表。大量的操作都是针对当前使用的数据表,也就是Dv_bbs3这个数据表进行的。那么,只要在数据库里面留下Dv_bbs3数据表就够了,Dv_bbs1和Dv_bbs2这些旧数据表就可以单独存放到另一个数据库里面。
这样做的原因是,第一,主数据库里面只有Dv_bbs3数据表,Dv_bbs1和Dv_bbs2这些数据表被从主数据库里面分离出来以后,主数据库的体积就减小了190M,这就极大地提升了主数据库查询效率。而在一般情况下,不会有很多人去查看旧的帖子和回复旧的帖子,这样对Dv_bbs1和Dv_bbs2这些旧的数据表的查询就非常少,所以虽然把旧数据表分离出来后,对旧数据表的查询将有可能比原来更低一些,但是因为对旧数据表的查询量很少,所以在总体上对性能的影响不大。然而,由于主数据库的体积大大减小,对于当前使用的数据表Dv_bbs3的查询效率会有很大的提升,而很多查询都是针对当前正在使用的数据表的,因此在总体上对性能的提升会有很大的帮助。这样一来,总的来说还是提高了数据库查询的效率。
理论说完了,下面就开始实践。
把旧数据表分离出来并不算困难,只要新建一个数据库,接着把旧数据表导入,然后在主数据库里面把旧数据表删除,最后再压缩一下主数据库就行了。这样操作以后,YT主数据库的大小缩小到了65M左右,相比原来的250M(因为很久没有压缩修复数据库了,我把数据库下载回来压缩后大小由原来的290M变成了250M)缩小了很多。而新建的存放旧数据表的数据库大小则有190M,不过没关系,反正只是承载少量查询而已,大一点小一点差别都不大。
接下来的问题是怎样在不修改程序的情况下让动网在查询旧数据表的时候是去查询我们导出来另外存放的数据库而不是主数据库。这个问题可以用视图和Access跨数据库查询的方法轻而易举地解决。
首先要在主数据库里面创建一个查询,就命名为Dv_bbs1,查询内容就写上 SELECT * FROM [旧帖子数据表数据库物理地址].Dv_bbs1 ,因为视图和数据表在SQL查询语句里面是不会进行区分的,所以动网论坛在进行查询的时候,肯定会使用类似 SELECT * FROM Dv_bbs1 这样的语句,这个时候Dv_bbs1就是主数据库里面的视图而不是数据表,这个视图返回的是旧帖子数据库里面Dv_bbs1数据表的内容,最后的查询结果与查询没有优化过的数据库的结果是一样的。
同样,建立第二个视图,命名为Dv_bbs2,查询内容是 SELECT * FROM [D:\www\Ccs\database\bbs_old_postdata.mdb].Dv_bbs2 。完成之后,把主数据库和旧帖子数据表数据库上传,就完成了数据库的优化工作。
当然有一点要注意的是,在查询内容里面的数据库地址是数据库在服务器上的物理地址,这点一定要小心啊,要不然可就查询不到旧数据表了
最后附上YT数据库优化前后的本地性能测试结果
[file]attachment/200707/1185811930_0.zip[/file]
相关文章:
F-22's Trace
greensea 的个人主页
sky-city
极夜奁
小樱之町
不错。
可是这样老的帖子就无法回复了。
不错不错~ 貌似用了视图 真有你的 嘿嘿~~