我该怎么做才能加快这个慢查询的速度?

时间:2011-07-19 18:42:25

标签: mysql performance cakephp

在我的CakePHP 1.3应用程序上有一个产品页面。在此页面上显示当前产品加上2个相关产品。

相关产品基于此功能在产品型号上找到:

public function related($id, $limit = 2)
{
    $item = $this->find('first',array(
        'fields'=>array('Product.style_number','Product.brand'),
        'conditions'=>array('Product.id'=>$id),
        'recursive'=>0,
    ));

    $data = $this->find('all',array(
        'fields'=>array('Product.id','Product.name','Product.image','Product.url','levenshtein(Product.style_number,"'.$item['Product']['style_number'].'") as dist'),
        'limit'=>$limit,
        'conditions'=>array('NOT'=>array('Product.id'=>$id),'Product.brand'=>$item['Product']['brand']),
        'order'=>'dist',
    ));

    return $data;
}

此功能根据levenshtein距离查找具有最接近样式编号的产品。在查询中,levenshtein()是用户定义的MySQL函数,您可以view source here

当我在一张大约100行的桌子上测试时,它相当快。但是我的Product表目前有10K行且不断增长。

我尝试添加'Product.brand'=>$item['Product']['brand']来限制它操作的行数,并且我还将Product.style_number作为索引,希望加快它的速度。

它仍然非常慢,加载页面时会导致大约2-3秒的延迟。

我能做些什么来加快速度?有没有办法我可以缓存它...如何?

我能以更快的方式获得相同的数据吗?

我有什么选择?

我得到的结果非常准确,它找到了最接近的相关产品。

1 个答案:

答案 0 :(得分:2)

听起来这对于AJAX工作流程来说是一个很好的应用程序。如果距离计算占用大部分时间(特别是如果它不是页面的主要部分)那么您应该能够通过单独运行该查询来实现大幅加速。