2012-01-28 17 views
2

私の問題はこれです:MySQLのサブクエリは悪いパフォーマンスを登録しよう

select * from 
    (
    select * from barcodesA 
    UNION ALL 
    select * from barcodesB 
    ) 
    as barcodesTOTAL, boxes 
where barcodesTotal.code=boxes.code; 

表barcodesAは4000のエントリ 表barcodesB 表ボックスは180.000エントリ

それはproccessする30秒かかり似ている4000個のエントリを持っているがありますクエリ。

別の問題クエリ:

select * from 
    viewBarcodesTotal, boxes 
where barcodesTotal.code=boxes.code; 

viewBarcodesTotalは、両方のバーコードテーブルからのUNION ALLを含んでいます。それはまた永遠にかかります。

一方

 select * from barcodesA , boxes where barcodesA.code=boxes.code 
     UNION ALL 
     select * from barcodesB , boxes where barcodesB.code=boxes.code 

この1つは< 1secondをとります。

質問は明らかにWHY?、私のコードは盗まれていますか? mysqlは盗まれていますか?

私はmysqlへのアクセスから移行する必要があり、最初のオプションが盗まれた場合は、すべてのコードを書き直す必要があります。

+0

簡潔に言えば、サブクエリは遅く、可能な場合は避けてください。 – Polynomial

+1

クエリでEXPLAINを実行し、その出力を質問に含めることができます。それ以外の場合は、コードフィールドにインデックスがありますか?あなたは本当にすべてのデータを取得する必要がありますか、またはサブセット(条件に基づいて)で十分でしょうか? –

答えて

0

まだインデックスがない場合は、boxes.codeにインデックスを追加してください。 8000レコード(4K + 4K)を180,000に結合すると、180K側のインデックスから利益を得ることができます。

また、SELECTステートメントで必要なフィールドを明示的に指定する必要があります。プロダクション用のクエリで*を使用すると、あなたの例に2つの異なるテーブルがあることは言うまでもありませんが、どのフィールド(どのくらいの大きさ)を考える必要がないので、悪いフォームです。barcodesabarcodesbあなたが合併するしている別のデータ型と列の注文....

+0

バーコードA、バーコードAには衣服に関連付けられたバーコードが含まれています。ボックスには、ボックスに関連付けられた20のバーコードがあります。インデックスはどこに置くべきですか?また、私は選択*を使用しない、私はちょうどそれを簡潔にしたい、よりeaslyを読むことができます。 – Fran

0

パフォーマンスの違いの理由...

最初のクエリが...まず、Aの各レコードの完全な結合を行うと言いますBのすべてのレコードと結合されています。次に、コードのボックスに結合します。ユニオンには最適化するインデックスがありません。

明示的にSECONDクエリインスタンスを適用すると、各テーブルは個別に最適化されます(明らかに2番目のパフォーマンスごとにインデックスがありますが、両方のテーブルに "コード"列のインデックスがあることを確認します)。

+0

インデックスを確認するにはどうすればよいですか? どの列を使用する必要がありますか? テーブルを覚えています: バーコード、バーコード、シーソン、モデル、色 バーコードB>バーコード、セーソン、モデル、カラー.------。 :::::例::::: 84232323232、1、100、225 ボックス> boxNumber、バーコード、 詳細を:::::例::::: 000000000001、84232323232、どの – Fran

+0

@Fran 、http://dev.mysql.com/doc/refman/5.0/en/getting-information.htmlは "Describe Table {yourTable}"コマンドを表示します。 – DRapp

+0

スクリーンキャプチャが必要ですか? – Fran

関連する問題