mysql - 我该怎么做才能加快这个缓慢的查询?

标签 mysql performance cakephp

在我的 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/

相关文章:

mysql - 将 ID 重置为 SQL 中的逻辑顺序

mysql - 从两个表中选择位置

performance - 我应该对托管网站进行负载测试吗?怎么样?

android - Android Gradle构建需要大量时间来执行代码

php - 在 Cakephp 中使用不等于运算符

mysql - 获取mysql中连续日期的计数

python - 替代合并排序的效率?

php - 在 php 或 Cakephp 中使用 fgetcsv 导入大型 CSV 文件

php - 在 cakePHP 的页面顶部显示所有模型验证错误

php - AJAX 响应和 PHP 循环