2011-11-11 2 views
0

2つのプロジェクト(AとB)があります。 彼らはどちらもCakePHPフレームワーク上に構築されており、基本的に同じ構造を持っています。つまり、両方のデータベースが同じ構造を持っています。それらが同一であるとしましょう。「一致しない」と検索すると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 ...構文を効率的に使うか考えている人は、ビューやいくつかの連結された要素を投稿してください。私はおそらく上記の解決策を放棄するでしょう。

+0

?デバッガを実行して、「ジャムする」場所を特定しましたか?このクエリを実行するコードは何ですか? – deceze

+0

mysqlでクエリを実行しましたが、問題があるようです。非常に長い時間がかかります(2〜5分)。クエリを最適化しなければならないと思われます。助けてくれてありがとう。誰かがどのようにMATCH ... AGAINST ...構文を効率的に使うか考えている人は、ビューやいくつかの連結された要素を投稿してください。私はおそらく上記の解決策を放棄するでしょう。 –

答えて

1

結合テーブル '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 
関連する問題