2016-09-25 13 views
0

私はclassiffiedsのウェブサイトを持っており、今月新たな訪問者がたくさんありました。MySQL:300秒以上のクエリを最適化しますか?

ウェブサイトが爆発し、「DBと接続できません」というメッセージが配信され始めました。私はCodeIgniterのを使用していますし、これは国連のMySQLログのトレースです:あなたはそれが完了するまでに378.515875秒を取っ見ることができるように

# Time: 160924 22:50:20 
# Thread_id: 1914 Schema: erich33_asd QC_hit: No 
# Query_time: 378.515875 Lock_time: 375.061742 Rows_sent: 75 Rows_examined: 152644 
SET timestamp=1474771820; 
SELECT `category`.`id` as `category_id`, `category`.`subcat` as `category_name`, `category`.`desc` as `category_desc`, `category`.`name` as `category_pretty_name`, `ads`.`id`, `ads`.`header`, `ads`.`price`, SUBSTR(ads.body, 1, 160) as body, `ads`.`sellfast`, `ads`.`foto1`, `ads`.`foto2`, `ads`.`foto3`, `ads`.`foto4`, `ads`.`foto5`, `ads`.`updated`, `ads`.`created`, `ads`.`hits`, `promo`.`promotype` as `promo_type`, `provinces`.`prov_name`, `supercategory`.`name` as `supercategory_name`, `supercategory`.`id` as `supercategory_id` 
FROM `ads` 
JOIN `category` ON `category`.`id` = `ads`.`subcat_id` 
JOIN `supercategory` ON `supercategory`.`id` = `category`.`cat` 
JOIN `provinces` ON `provinces`.`id` = `ads`.`province_id` 
LEFT OUTER JOIN `promo` ON `promo`.`ads_id` = `ads`.`id` 
WHERE `ads`.`subcat_id` = '22' 
AND `recycle_bin` != 1 
AND `hidden` =0 
ORDER BY `promo_type` DESC, `updated` DESC 
LIMIT 833, 75; 

時間を短縮するためにこのクエリをどのように最適化しますか?

+3

クエリアナライザを実行してクエリが何をするかを教えるには、MySQLのEXPLAIN動詞を使用する必要があります。スキーマで定義した索引のようなものに依存します。 http://dev.mysql.com/doc/refman/5.7/en/using-explain.html –

答えて

1

問題は、DBスキーマのインデックスの設定が不良です。 ads.recycle_bin、ads.hidden、ads.subcat_idにインデックスを追加しました

ありがとうございました!