在我的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秒的延迟。
我能做些什么来加快速度?有没有办法我可以缓存它...如何?
我能以更快的方式获得相同的数据吗?
我有什么选择?
我得到的结果非常准确,它找到了最接近的相关产品。
答案 0 :(得分:2)
听起来这对于AJAX工作流程来说是一个很好的应用程序。如果距离计算占用大部分时间(特别是如果它不是页面的主要部分)那么您应该能够通过单独运行该查询来实现大幅加速。