同じ関数を使用できる2つのクエリを作成しました。それらは両方とも私が単一のクエリにマージしたいプロパティを含んでいますが、私はできませんでした。サブクエリと左結合を使用したMySQLインデックスの最適化
QUERY 1 - 私が欲しい結果を正確に教えてくれます。遅い(〜0.700秒)
QUERY 2 - 私が無視してスキップする行がたくさんあります。速い(〜0.005秒)
私の目標は、項目ごとに1を除くすべてのヌル価格行を削除するようにQUERY 2を変更することです。私はパフォーマンスに苦労してこれをやっているようには思えません。これは私の経験不足とMySQLでのインデックス使用の理解によるものです。
QUERY 1
は10K行が含まtbl_sale(e)の間でインデックスの使用を許可していない設計が不十分な副問合せを使用します。ここ
SELECT b.id, b.sv, b.description, der.store_id, f.name, der.price
FROM tbl_watch AS a
LEFT JOIN tbl_item AS b ON a.item_id = b.id
LEFT JOIN (
SELECT c.store_id, d.flyer_id, e.item_id, e.price
FROM tbl_storewatch AS c, tbl_storeflyer AS d
FORCE INDEX (storebeg_ndx) , tbl_sale AS e
WHERE c.user_id = '$user_id'
AND (
d.store_id = c.store_id
AND d.date_beg = '20121206'
)
AND e.flyer_id = d.flyer_id
) AS der ON a.item_id = der.item_id
LEFT JOIN tbl_store as f ON der.store_id = f.id
WHERE a.user_id = '$user_id'
ORDER BY b.description ASC
は、クエリのEXPLAIN 1
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY a ref user_item_ndx user_item_ndx 4 const 30 Using index; Using temporary; Using filesort
1 PRIMARY b eq_ref PRIMARY PRIMARY 4 a.item_id 1
1 PRIMARY <derived2> ALL NULL NULL NULL NULL 300
1 PRIMARY f eq_ref PRIMARY PRIMARY 4 der.store_id 1
2 DERIVED c ref user_ndx user_ndx 4 6
2 DERIVED e ALL NULL NULL NULL NULL 9473 Using join buffer
2 DERIVED d eq_ref storebeg_ndx storebeg_ndx 8 c.store_id 1 Using where
QUERY 2
すべての左を使用します(ORDER BYを除いて)非常に効率的である合流。インデックスはすべての結合で使用されます。このクエリは、tbl_watch内のすべてのアイテムに対して可能なすべての一致を返します。ここでは、クエリは次のとおりです。ここで
SELECT b.id, b.sv, b.description, c.store_id, f.name, e.price
FROM tbl_watch AS a
LEFT JOIN tbl_item AS b ON a.item_id = b.id
LEFT JOIN tbl_storewatch AS c ON c.user_id = '$user_id'
LEFT JOIN tbl_storeflyer AS d ON d.store_id = c.store_id
AND d.date_beg = '$s_date'
LEFT JOIN tbl_sale AS e ON e.item_id = a.item_id
AND e.flyer_id = d.flyer_id
LEFT JOIN tbl_store as f ON d.store_id = f.id
WHERE a.user_id = '$user_id'
ORDER BY b.description ASC
は、クエリのEXPLAINです:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE a ref user_item_ndx user_item_ndx 4 const 6 Using index; Using temporary; Using filesort
1 SIMPLE b eq_ref PRIMARY PRIMARY 4 a.item_id 1
1 SIMPLE c ref user_ndx user_ndx 4 const 2
1 SIMPLE d eq_ref storebeg_ndx,storendx storebeg_ndx 8 c.store_id,const 1
1 SIMPLE e eq_ref itemflyer_ndx itemflyer_ndx 8 a.item_id,d.flyer_id 1
1 SIMPLE f eq_ref PRIMARY PRIMARY 4 d.store_id 1
は、どのように私は私にQUERY 1のように、私は必要なだけの行を与えるためにQUERY 2(より効率的な)を変更することができますと連携?クエリ2は、すべて左を使用している間QUERY 1で マイク
最初のクエリがどのようにしてあなたの望みを与えるのかはわかりません。左ジョインは左外ジョインではありません(おそらくMySQLにあり、SQLには準拠していません)。また、NULLは一意の値ではありません。私は便利なMySQLを持っていませんが、これをPostgreSQLに落としても、あなたが記述した結果は得られません。私の答えは... – PlexQ