1

我们有一个拥有大约 300,000 人的网站 - 我们要做的是创建一个页面,其中包含所有以 A、B 或 C 开头的人名。

挑战在于速度。

你将如何设置你的数据库。你做一个缓存集合。你使用正则表达式还是其他东西。

我所做的是以下内容;

 $letter = 'A';

$where  = array();
$where['name']  = new MongoRegex("/^" . $letter . "/i");
$sort   = array('name' => 1);

if($hasImage){
    $where['images.profiles.0'] = array('$exists' => true);
}

$fields = array('name' => 1, 'images.profiles' => 1);

 $this->mdb->data_people->ensureIndex(array('name' => 1, 'images.profiles' => 1), array('background' => true) );
 $people = $this->mdb->data_people->find( $where, $fields );

$people = $people->sort( $sort );
$page['total']      = 100;
$page['current']    = 1;
$page['perPage']    = 20;

if(isset($this->domain->getQuery['_page']) && $this->domain->getQuery['_page'] > 1){
   $page['current'] = $this->domain->getQuery['_page'];
}

$data['pages'] = $this->pageNavigation->setNavigation((int) $page['total'], (int) $page['perPage'], (int) $page['current'] );
$data['pages']['page'] = $this->domain->menu_reverse[0];
$data['pages']['path'] = $this->domain->path;

$data['data'] = $people->limit($page['perPage'])->skip( ($page['perPage']*($page['current']-1)) );
4

1 回答 1

1

你几乎在做正确的事。

您甚至使用了正确的正则表达式,因为它只查找字符串的开头,因此 Mongodb 可以使用name索引。

见本页底部: http: //docs.mongodb.org/manual/reference/operator/query/regex/

我只看到两个潜在的问题(但一如既往:不要做过早的优化,你的代码就可以了):

于 2013-12-05T08:43:34.563 回答