日期:2014-05-16  浏览次数:20581 次

mongoDB高效分页类

最近在研究mongodb,发现她的性能比mysql好很多,但具体快多少还没有测试过。

?
项目组最近在策划新的游戏,我们程序都开始准备相关的东西,首先是游戏的后台,由于用mongodb,所以整个框架都得重新写过,分页类也不例外。本来分页是用skip+limit的,但有一次我不知道手哪里痒了,弄了80+w数据进去,发现这种分页方法的效率骤然下降,从第一页翻到最后一页竟然要0.9s,而且只是80+w数据,效率实在太低了,因为考虑到操作日志,消费日志这些大表,百万级数据是很正常的事情,所以这样的分页是伤不起的,所以我决定改进一下分页的算法。
从网上找到资料,原来对于大数据量的分页,都不用skip+limit的,是通过改变查询规则来起到分页的效果。由于不用略过,所以无聊数据量有多大,时间复杂度的波动不大。
?
<?php
//mongoDB分页类
class Page {
var $count='';
var $size='';
var $total='';
var $last='';
var $link='';
var $url='';
var $set='';
var $page='';
var $turnto='';
var $key = '';
var $next = '';
var $prev = '';
var $lefttresult = '';
var $rightresult = '';
var $left = '';
var $right = '';
var $orderby = '';
var $lastd = '';
var $db = '';
?
//构造函数
public function __construct($last, $key, $orderby){
global $DB;
$this->db = $DB;
$this->count = $this->db->count($this->db->get_table());
$url = SITE_ROOT.strtolower(CLASS_NAME).'/'.METHOD_NAME;
$this->url = $this->url ? $this->url : $url;
$set = $set ? $set : 5;
$this->set = $set;
$size = $size ? $size : PAGE_SIZE;
$this->size = $size;
$this->last = $last;
$this->prev = $DB->get_prev($this->last);
$this->next = $DB->get_next($this->last);
$this->page = GET::UINT('page');
$this->page = $this->page ? $this->page : 1;
$this->total = @ceil($this->count / $this->size);
$this->key = $key;
$this->orderby = $orderby;
}
?
//输出分页链接
public function get_link(){
if($this->total != 1){
$this->get_first();
$this->get_prev();
$this->get_center();
$this->get_next();
$this->get_last();
$this->get_turnto();
}
if($this->link){
$thi