MySQLでのテーブル接続クエリーの簡単な最適化チュートリアル

2914 ワード

MySQLでA LEFT JOIN B join_conditionの実行手順は次のとおりです.
・テーブルAとAが依存する全てのテーブルに基づいてテーブルBを設定する.
・LEFTJOIN条件で使用する全てのテーブル(Bを除く)に基づいてテーブルAを設定します.
・LEFTJOIN条件は、テーブルBから行を検索する方法を決定するために使用される.(換言すれば、WHERE句の中のいかなる条件も使用しない).
・すべての標準結合を最適化できますが、依存するすべてのテーブルから読み込まれたテーブルの例外のみです.循環依存関係が発生した場合、MySQLプロンプトでエラーが発生しました.
・全ての標準WHERE最適化を行う.
・Aの1行がWHERE句に一致するが、Bの1行がON条件に一致しない場合、全ての列がNULLに設定された別のB行が生成される.
・LEFTJOINを使用して、あるテーブルに存在しない行を見つけ、WHERE部分のcol_name IS NULL、そのうちcol_nameはNOT NULLと宣言された列で、MySQLはLEFTJOIN条件に一致する行を見つけた後、他の行の検索を停止します(特定のキーワードの組合せです).
RIGHT JOINの実行はLEFT JOINのようなもので、表の役割が逆になるだけです.
結合オプティマイザは、テーブルを結合する順序を計算します.LEFTJOINとSTRAGHT_JOINが強制するテーブルの読み取り順序は、チェックするテーブルの交換が少ないため、結合オプティマイザがより速く動作するのに役立ちます.この説明は、次のタイプのクエリを実行する場合、MySQLがbをフルスキャンすることを示しています.LEFTJOINはdの前に読み込むように強制しているからです.

SELECT *
FROM a,b LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)
WHERE b.key=d.key;


この場合の修復はaの逆の順序で行われ,bはFROM句に列挙される.

SELECT *
FROM b,a LEFT JOIN c ON (c.key=a.key) LEFT JOIN d ON (d.key=a.key)
WHERE b.key=d.key;


MySQLでは、生成されたNULL行に対してWHERE条件の合計が偽の場合、LEFT JOINが通常の結合になるように、LEFT JOINの最適化を行うことができます.
たとえば、t 2の場合、次のクエリで.column 1はNULL、WHERE句はfalseになります.

SELECT * FROM t1 LEFT JOIN t2 ON (column1) WHERE t2.column2=5;


これにより、クエリを通常の結合に安全に変換できます.

SELECT * FROM t1, t2 WHERE t2.column2=5 AND t1.column1=t2.column1;


これにより、クエリをより良くすることができる場合、MySQLはテーブルt 1の前にテーブルt 2を使用することができるため、より高速になります.テーブルシーケンスを強制的に使用するには、STRAGHT_を使用します.JOIN.
また、条件をフィルタリングしてから、テーブル接続に基づいてテーブルに関連するクエリーフィールドのインデックスを作成すると、ビッグデータのマルチテーブルがクエリーを結合する場合にかなり速くなります.次の例の書き方を見てみましょう.

SELECT M.*,SS.SensorCode,SS.SensorStatus,SS.ManufacturerId,SS.Electricity,
SS.Voltage,SS.MinElectricity,SS.MinVoltage,SS.Temperature,SS.StatusUpdteDate,SS.UpdateStatus ,tp.PricingStrategyid,tps.FreeDuration,bat.BerthTypeId 
FROM
(SELECT T.* , BS.ParkStatus,BS.ChangeTime ,CA.CantonName, SE.SectionName
 FROM
(SELECT A.* ,B.BerthId,B.BerthCode,B.BerthAddress,B.BerthStatus,B.LineDirection,B.CantonId,B.SectionId 
FROM 
(SELECT AR.AreaId,AR.AreaCode,AR.AreaName FROM  SYS_Area AS AR WHERE 1=1  AND AR.AreaCode='110' ) A 
LEFT JOIN SYS_Berth AS B ON B.AreaId=A.AreaId ) T
JOIN SYS_BerthStatus AS BS ON T.BerthCode=BS.BerthCode 
JOIN SYS_Canton AS CA ON T.CantonId=CA.CantonId 
JOIN SYS_Section AS SE ON T.SectionId=SE.SectionId )M

LEFT JOIN SYS_Sensor SS ON M.BerthCode=SS.BerthCode 
LEFT JOIN TRA_PricingBerth AS tp ON tp.BerthCode=M.BerthCode 
 
LEFT JOIN TRA_PricingStrategy AS tps ON tps.PricingStrategyId=tp.PricingStrategyId 
LEFT JOIN SYS_BerthAndType AS bat ON bat.BerthCode=M.BerthCode 
ORDER BY BerthCode ASC