关于基于 MS SQL SERVER 的论坛分页模块问题
关于基于 MS SQL SERVER 的论坛分页模块问题
对于 mysql,有limit语句进行对特定访问数据的查询。但对于 MS SQL SERVER,就没有 limit语句了,由于我写的论坛(http://ynwa.yeah.net)是用 MS SQL SERVER做数据库服务器的。这个问题一度令我非常烦恼。最终,刚开始学 MS SQL SERVER的我看了很多书,找到了一个解决的方案,用一种叫“游标”的方法。
部分关键代码如下:
<?php
……
……
//访问数据库,在数据库建立游标,作分页显示用
//为已经按发表时间排列好的所有主题建立游标 num_of_topic
$str_select_message="declare num_of_topic SCROLL CURSOR FOR ";
$str_select_message.="select * from soccer_forum where message_pro='farther' and on_top=0 and table_id=$table_id order by lastest_time DESC";
$select_message=mssql_query($str_select_message);
//打开游标 num_of_topic
$str_open_cursor="open num_of_topic";
$open_cursor=mssql_query($str_open_cursor);
//计算每页开始,结束的数据的游标数(假设每页显示20条主题)的公式
$star_data=1+($page-1)*20;
$end_data=($page-1)*20+20;
//如果是最后一页,循环所列出的表格等于剩余的帖数
if($page==$total_pages){
$end_data=$total_data;
}
//显示主题,按每页开始,结束的游标访问数据库记录
for($i=$star_data;$i<=$end_data;$i++){
$str_query="fetch absolute $i from num_of_topic";
$query=mssql_query($str_query);
$fetch_object=mssql_fetch_object($query);
//get_message.php是用于循环显示已经调出的20条主题的模块
require("functions/get_message.php");
}
……
……
//以下是分页显示的页数链接(省略)
……
?>
问题好像解决了,本来以为可以用游标就能在用户打开特定页数时,数据库只访问特定的20条记录,这样会提高速度。但后来想了很久,发觉,我在建立游标之前,最终也用到了:
select * from soccer_forum where message_pro='farther' and on_top=0 and table_id=$table_id order by lastest_time DESC";
也就是说,在建立游标前,数据库先要访问所有数据,为所有数据按时间排列顺序,这样实际上只访问20条数据,但却要查询所有数据,会不会导致用户访问论坛时浪费了服务器的访问时间,导致调出数据缓慢呢?实际上,我的论坛暂时只有主题200多,连回复都不超过2000,我试过用SQL QUERY ANALYZER 用 select * from soccer_forum ,结果1000多条数据用了不过1秒。我惊叹数据库速度快之余,不禁又担心到,现在我论坛速度正常,会不会可能是主题很少,即使访问所有数据,也不会感到缓慢呢?我的分页模块,在理论上到底是合理,还是非常愚蠢呢?假设我的论坛主题多达数百万(当然不可能)时,访问速度是不变,还是提高数千倍呢?请各位高手告诉我理论上会出现的后果。
同时,以大家写论坛的经验,你们在用 MS SQL SERVER 做数据库时,你们是用什么方法建立分页模块的呢?