В моем приложении 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 секунды.
Что можно сделать, чтобы сделать это быстро?Есть ли способ, которым я могу кешировать это .. если так, то как?
Есть ли другой способ получить те же данные быстрее?
Какие у меня варианты?
Результаты, которые я получаю, довольно точны, так как они находят наиболее близкие продукты.