0
SELECT products.* 
FROM products 
LEFT JOIN product_category 
    ON products.id_product = product_category.id_produs 
LEFT JOIN categories 
    ON product_category.id_category = categories.id_category
INNER JOIN options 
    ON products.id_product = options.id_product 
WHERE categories.id_category = '472' 
AND product_category.id_category = categories.id_category
LIMIT 0, 20

こんにちは、私はプログラミング コンテスト用の e コマース Web サイトに取り組んでおり、製品がリストされるカテゴリ ページに問題があります。

MySQL には、products、category、product_category (category と products の関係を含む)、および options の 4 つのテーブルがあります。オプション テーブルには、購入を選択できる製品のさまざまな属性 (重量、高さ、色など) が含まれています。製品フィルターがあるため、カテゴリ ページでこれらを呼び出す必要があります。色: 赤を選択すると、属性色: 赤のすべての製品が表示されます。

製品テーブルに 10,000 行あり、各製品に 5 つのオプションがある場合、オプション テーブルには 50,000 行があり、問題はクエリが非常に遅くなり、製品を表示するのに 30 秒以上かかることです。 . 問題はクエリにあると確信していますが、その作成方法はわかりません。ページ上の商品を 5 秒以内に取得するには、クエリに何を記述すればよいですか?

4

2 に答える 2

0

これらのテーブルの id_category と id_product にインデックスがあることを確認してから、そのEXPLAIN前に貼り付けて、出力を投稿します。正直なところ、インデックスがない場合でも、とにかく仕事をする可能性があります。

于 2012-06-04T10:54:11.877 に答える
0

いくつかのこと: この関係を 2 回指定しています。

AND product_category.id_category = categories.id_category

ON product_category.id_category = categories.id_category

これは、データベース オプティマイザを混乱させる可能性があります。

別の潜在的な最適化は、WHERE 句を実行している列をテーブルの上に移動することです。`WHERE categories.id_category = '472'product_category.id_category = '472' すると、結合されるレコードの数が減ります。

いくつかの質問で述べたように、EXPLAIN計画はクエリのどの部分が遅いかを示し、インデックスが欠落しているかどうかを示します。

于 2012-06-05T00:55:51.773 に答える