CakePHP CakeDC搜索插件慢查询

时间:2014-02-01 16:34:51

标签: mysql cakephp pagination

我不是CakePHP或mySQL大师,任何建议都表示赞赏。

我基本上从我的字段的CakeDC手册复制/粘贴/更改中设置了HABTM搜索。

宝藏模型[相关]代码:

public $filterArgs = array(
  array('name' => 'makers', 'type' => 'subquery', 'method' => 'findByMaker', 'field' =>    'Treasure.id'));

public function findByMaker($data = array()) {
    $this->MakersTreasure->Behaviors->attach('Containable', array('autoFields' => false));
    $this->MakersTreasure->Behaviors->attach('Search.Searchable');
    $query = $this->MakersTreasure->getQuery('all', array(
        'conditions' => array("Maker.name LIKE '%" . $data['makers'] ."%'"),
        'fields' => array('treasure_id'),
        'contain' => array('Maker')
    ));
    return $query;
}

带有Paginator的TreasuresController:

$this->Paginator->settings['conditions'] = $this->Treasure->parseCriteria($this->Prg->parsedParams());
$this->set('treasures', $this->Paginator->paginate());

该数据库包含大约20,000件珍宝和约2,000名制造商 - 这对我来说似乎并不是很大。

我查看了COUNT和SELECT(带LIMIT)查询,它们只是运行缓慢。我认为IN条款真的需要付出代价。关于如何从CakePHP中修复这个慢查询的任何想法?

1 个答案:

答案 0 :(得分:2)

啊,我一路上学到了更多关于mySQL的知识。答案(对我来说):

在联结表上索引FK。我想,随着我对mySQL的了解越来越多,我应该知道这一点。

对我而言:

use oc1;
alter table makers_treasures add index (maker_id);
alter table makers_treasures add index (treasure_id);

COUNT查询现在需要.12秒才能运行,而不是超过3分钟。