2017-09-28 12 views
0

私はjoinsとsubqueryを使ってクエリを書いています。その実行には2分かかります。私はそれを最適化することができませんどのように私はできますか?なにか提案を?このサブクエリはどのように最適化できますか?

select oli.*,oli2.* from order o 
LEFT JOIN order_line_item oli ON oli.order_id = o.id 
LEFT JOIN order_line_item oli2 ON oli2.id 
= (SELECT oli3.id FROM order_line_item oli3 
WHERE oli3.order_id = o.id 
AND oli.code = oli3.alternative 
GROUP BY oli3.code, o.id 
LIMIT 1) WHERE o.store_id != 100 GROUP BY oli.code, oli2.code, o.id 

サブクエリは正しく動作しますが、時間がかかりすぎます。実際には、それは代替製品を見つける。サブクエリを最適化するにはどうすればよいですか?

+1

クエリに関係するすべてのテーブルに対して、 'SHOW CREATE TABLE '出力を提供してください。 –

+1

また、 '*'を選択する必要がありますか?すべての列が必要ない場合は、テーブル構造(上記のコメント)から学んだ内容と必要な列に基づいて改善が行われる可能性があります。 –

+0

'*'のために 'GROUP BY'の無効な使用のような臭いがあります。 –

答えて

0

oli2 ONのサブクエリは、すべての行に対して実行する必要があるため、遅さの原因となっています。これは、このように単純化することができますcode

SELECT 
    oli.*, 
    oli2.* 
FROM order o 

LEFT JOIN order_line_item oli 
ON oli.order_id = o.id 

LEFT JOIN order_line_item oli2 
ON (
    o.id = oli2.order_id 
    AND 
    oli.code = oli2.alternative 
) 

WHERE o.store_id != 100 

GROUP BY oli.code, oli2.code, o.id 
+0

ありがとうございますが、まだ遅いです – willywonka15

0

インデックスがあるため、「接頭辞」で、おそらく役に立たないです。

"767 limit in 5.6"には複数の回避策があります。 "191修正"はおそらくあなたの状況にとって最悪です。マイLimits blogリストあなたの修正及び他4:

  • アップグレード5.7.7に3072バイトの制限のために - あなたの雲がこれを提供することはできません。
  • VARCHARで255から191に変更すると、191文字より長い値は失われます(ほとんどありません)。
  • ALTER .. CONVERT TO utf8 - あなたは絵文字といくつかの中国語を失います。
  • (現在の修正プログラム)「プレフィックス」インデックスを使用すると、パフォーマンス上のメリットが失われます。
  • 5.6/5.5/10.1に留まりますが、制限を3072バイトに上げるために4つのステップを実行します(詳細はブログにあります)。

codealternativeの両方を必ず変更してください。この勧告では十分ではない場合、私はより深く掘り下げます。

関連する問題