在我的 CakePHP 1.3 应用程序上有一个产品页面。此页面显示当前产品和 2 个相关产品。
在Product Model上根据这个函数找到相关的产品:
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()
是用户定义的 MySQL 函数,您可以 view source here
当我在一个大约有 100 行的表上测试它时,它相当快。但是,我的 Product 表目前有 10K 行并且还在增长。
我尝试添加 'Product.brand'=>$item['Product']['brand']
来限制它操作的行数,我还制作了 Product.style_number
希望加快速度的索引。
它仍然很慢,在加载页面时会导致大约 2-3 秒的延迟。
我该怎么做才能加快速度?有没有办法缓存它..如果是的话如何?
是否有其他方法可以更快地获取相同的数据?
我有哪些选择?
不过,我得到的结果非常准确,它找到了最接近的相关产品。
最佳答案
听起来这对于 AJAX 工作流来说是一个很好的应用程序。如果距离计算花费了大部分时间(特别是如果它不是页面的主要部分),那么您应该能够通过单独运行该查询来实现显着的加速。
关于mysql - 我该怎么做才能加快这个缓慢的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6752370/