Поиск с помощью «MATCH AGAINST» приводит к сбою приложения CakePHP - PullRequest
0 голосов
/ 11 ноября 2011

У меня есть два проекта (A и B).Они оба построены на платформе CakePHP, и в основном они получили одинаковую структуру, что означает, что обе их базы данных имеют одинаковую структуру.Допустим, они идентичны.

Я создал представление, в которое поместил все данные, необходимые для поиска, и назвал его search_areas.Каждый столбец из таблиц, которые находятся в представлении, являются индексами FULLTEXT.

Теперь, когда я выполняю поиск в проекте A, он работает как чудо-кнопка.Но когда я делаю это на проекте B, это занимает вечность.На самом деле, что-то застревает, что-то в кодеБаза данных работает нормально, но приложение не работает около 10 минут.Кто-нибудь сталкивался с такой проблемой?

Это SQL, который запускается при выполнении поиска:

SELECT 
    Product.*, 
    MainImage.*, 
    Currency.rate, 
    Category.green_tax, 
    CategoriesCategory.full_alias, 
    (Product.price*Currency.rate + Category.green_tax)*1.24 as real_price, 
    MATCH (SearchArea.Cname,SearchArea.Mname,SearchArea.Pname,SearchArea.description,SearchArea.special_description,SearchArea.model,SearchArea.part_number,SearchArea.series,SearchArea.color,SearchArea.big_string) AGAINST ('+search term' IN BOOLEAN MODE) as score 
FROM `products` AS `Product` 
LEFT JOIN currencies AS `Currency` ON (`Product`.`currency` = `Currency`.`code`) 
LEFT JOIN categories AS `Category` ON (`Product`.`category_id` = `Category`.`id`) 
LEFT JOIN manufacturers AS `Manufacturer` ON (`Product`.`manufacturer_id` = `Manufacturer`.`id`) 
LEFT JOIN categories_categories AS `CategoriesCategory` ON (`Product`.`category_id` = `CategoriesCategory`.`category_id`) 
LEFT JOIN search_areas AS `SearchArea` ON (`SearchArea`.`id` = `Product`.`id`) 
LEFT JOIN `product_images` AS `MainImage` ON (`MainImage`.`product_id` = `Product`.`id` AND `MainImage`.`main` = 1) 
WHERE 
    MATCH (`SearchArea`.`Cname`,`SearchArea`.`Mname`,`SearchArea`.`Pname`,`SearchArea`.`description`,`SearchArea`.`special_description`,`SearchArea`.`model`,`SearchArea`.`part_number`,`SearchArea`.`series`,`SearchArea`.`color`,`SearchArea`.`big_string`) AGAINST ('+search term' IN BOOLEAN MODE) 
    AND `Product`.`active` = 1 
LIMIT 15

Любые идеи?

****** EDIT *****

Я выполнил запросв MySQL и кажется, что есть проблема.Это занимает очень много времени (2-5 минут).Кажется, я должен оптимизировать свой запрос, возможно, найти другое решение.Спасибо за помощь.Если у кого-то есть идея, как эффективно использовать синтаксис MATCH ... AGAINST ... в представлении или каком-либо объединенном элементе, пожалуйста, напишите.Я, вероятно, откажусь от вышеуказанного решения.

1 Ответ

1 голос
/ 11 ноября 2011

Вы выполняете фильтрацию для объединенной таблицы 'SearchArea', неудивительно, что это занимает много времени.

Ваш запрос состоит в том, чтобы получить все продукты, объединить все таблицы и сохранить только то, что соответствует вашему фильтру.Ваш запрос должен выполнить следующее, выполнить поиск SearchArea, который имеет то, что вы ищете, а затем только присоединиться к таблицам.

Вы должны переписать свой запрос следующим образом:

SELECT 
    Product.*, 
    MainImage.*, 
    Currency.rate, 
    Category.green_tax, 
    CategoriesCategory.full_alias, 
    (Product.price*Currency.rate + Category.green_tax)*1.24 as real_price, 
    MATCH (SearchArea.Cname,SearchArea.Mname,SearchArea.Pname,SearchArea.description,SearchArea.special_description,SearchArea.model,SearchArea.part_number,SearchArea.series,SearchArea.color,SearchArea.big_string) AGAINST ('+search term' IN BOOLEAN MODE) as score 

FROM search_areas AS `SearchArea` 
LEFT JOIN `products` AS `Product` ON (`SearchArea`.`id` = `Product`.`id`) 

LEFT JOIN currencies AS `Currency` ON (`Product`.`currency` = `Currency`.`code`) 
LEFT JOIN categories AS `Category` ON (`Product`.`category_id` = `Category`.`id`) 
LEFT JOIN manufacturers AS `Manufacturer` ON (`Product`.`manufacturer_id` = `Manufacturer`.`id`) 
LEFT JOIN categories_categories AS `CategoriesCategory` ON (`Product`.`category_id` = `CategoriesCategory`.`category_id`) 
LEFT JOIN `product_images` AS `MainImage` ON (`MainImage`.`product_id` = `Product`.`id` AND `MainImage`.`main` = 1) 
WHERE 
    MATCH (`SearchArea`.`Cname`,`SearchArea`.`Mname`,`SearchArea`.`Pname`,`SearchArea`.`description`,`SearchArea`.`special_description`,`SearchArea`.`model`,`SearchArea`.`part_number`,`SearchArea`.`series`,`SearchArea`.`color`,`SearchArea`.`big_string`) AGAINST ('+search term' IN BOOLEAN MODE) 
    AND `Product`.`active` = 1 
LIMIT 15
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...