Что я могу сделать, чтобы ускорить этот медленный запрос? - PullRequest
1 голос
/ 19 июля 2011

В моем приложении 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() - это определенная пользователем функция MySQL, которую вы можете просмотреть здесь.

Когда я проверяю это на таблице с примерно 100 строками, это довольно быстро.Однако моя таблица Product в настоящее время имеет 10 000 строк и растет.

Я попытался добавить 'Product.brand'=>$item['Product']['brand'], чтобы ограничить количество строк, с которыми он работает, и я также сделал Product.style_number индексом в надежде ускорить его.

Он все еще довольно медленный, вызывает загрузку страницы примерно на 2-3 секунды.

Что можно сделать, чтобы сделать это быстро?Есть ли способ, которым я могу кешировать это .. если так, то как?

Есть ли другой способ получить те же данные быстрее?

Какие у меня варианты?

Результаты, которые я получаю, довольно точны, так как они находят наиболее близкие продукты.

1 Ответ

2 голосов
/ 19 июля 2011

Похоже, это было бы хорошим приложением для рабочего процесса AJAX.Если расчет расстояния занимает большую часть времени (особенно если он не является основной частью страницы), вы сможете существенно ускорить выполнение этого запроса отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...