2012-03-27 70 views
2

尋找一些幫助優化下面的查詢。似乎是目前的兩個瓶頸,導致它需要大約90秒才能完成查詢。只有5000個產品,因此它不是一個龐大的數據庫/表格。瓶頸是SQL_CALC_FOUND_ROWS和ORDER BY語句 - 如果我刪除這兩者,則需要大約一秒的時間才能運行查詢。 我試過刪除SQL_CALC_FOUND_ROWS並運行一個count()語句,但這需要很長時間。MySQL查詢優化

是最好的事情將是使用INNER JOIN的(我不太熟悉)根據以下Stackoverflow的帖子? Slow query when using ORDER BY

SELECT SQL_CALC_FOUND_ROWS * 
FROM tbl_products 
LEFT JOIN tbl_link_products_categories ON lpc_p_id = p_id 
LEFT JOIN tbl_link_products_brands ON lpb_p_id = p_id 
LEFT JOIN tbl_link_products_authors ON lpa_p_id = p_id 
LEFT JOIN tbl_link_products_narrators ON lpn_p_id = p_id 
LEFT JOIN tbl_linkfiles ON lf_id = p_id 
AND (
lf_table = 'tbl_products' 
OR lf_table IS NULL 
) 
LEFT JOIN tbl_files ON lf_file_id = file_id 
AND (
file_nameid = 'p_main_image_' 
OR file_nameid IS NULL 
) 
WHERE p_live = 'y' 
ORDER BY p_title_clean ASC, p_title ASC 
LIMIT 0 , 10 
+1

您是否需要將所有這些連接都留給連接?你是否理解內連接和左連接的區別? – nnichols 2012-03-27 21:14:12

+0

你能告訴我們一些CREATE TABLE語句嗎?你有什麼指數? – Daan 2012-03-27 21:26:22

+0

產品不一定需要類別,品牌,作者,解說員或任何鏈接文件..據我所知,在這種情況下,我需要使用LEFT JOIN。因爲如果我使用INNER JOINS,它不會匹配某些項目上的任何內容? – 2012-03-27 21:28:24

回答

1

你可以嘗試縮小尺寸的使用派生表檢索過濾和排序後的產品加入之前加入。這假定p_live,p_title_clean和p_title在你tbl_products表中的字段 -

SELECT * 
FROM (SELECT * 
    FROM tbl_products 
    WHERE p_live = 'y' 
    ORDER BY p_title_clean ASC, p_title ASC 
    LIMIT 0 , 10 
) AS tbl_products 
LEFT JOIN tbl_link_products_categories 
    ON lpc_p_id = p_id 
LEFT JOIN tbl_link_products_brands 
    ON lpb_p_id = p_id 
LEFT JOIN tbl_link_products_authors 
    ON lpa_p_id = p_id 
LEFT JOIN tbl_link_products_narrators 
    ON lpn_p_id = p_id 
LEFT JOIN tbl_linkfiles 
    ON lf_id = p_id 
    AND (
     lf_table = 'tbl_products' 
     OR lf_table IS NULL 
    ) 
LEFT JOIN tbl_files 
    ON lf_file_id = file_id 
    AND (
     file_nameid = 'p_main_image_' 
     OR file_nameid IS NULL 
    ) 

這是因爲沒有足夠的細節在你的問題是「在黑暗中刺」。

+0

感謝此 - 不得不略微調整它,但這有助於我理解如何正確優化它。 – 2012-04-01 21:03:54