2012-03-27 22 views
2

以下のクエリを最適化するための助けを探しています。クエリを完了するのに約90秒かかってしまう現時点で2つのボトルネックと思われます。 5000製品しかないので、まさに大規模なデータベース/テーブルではありません。ボトルネックはSQL_CALC_FOUND_ROWSとORDER BYステートメントです - これらの両方を削除すると、クエリを実行するのに約1秒かかります。 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

+0

いくつかのCREATE TABLEステートメントを表示できますか?どのようなインデックスがありますか? – Daan

+0

商品は必ずしもカテゴリー、ブランド、著者、ナレーターを必要とせず、リンクファイルもありません。私の知る限り、LEFT JOINを使用する必要がありますか? INNER JOINSを使用した場合、一部の項目では何も一致しないためですか? –

答えて

1

あなたは参加する前に濾過して、注文された製品を取得するために、派生テーブルを使用して参加するのサイズを小さくしてみてください。

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 
    ) 

これは、あなたの質問に十分な詳細がないとして「暗闇の中で刺す」である - これはp_live、p_title_cleanとp_titleがあなたのtbl_productsテーブルのフィールドであることを前提としています。

+0

ありがとうございました - 少し調整しなければなりませんでしたが、これは適切に最適化する方法を理解するのに役立ちました。 –