1.クエリ実行プロセスに関連付けられています
MySQLのデータが一致の全てが行われるまで、クエリに関連付けられたポリシーの施行が簡単ですが、彼はテーブルからサイクルアウト単一のデータをだろう、そして、その後、戻ってテーブルに、一致した行の次のテーブルにレコードを使用します。またとして知られている「ネストされたループ協会。」
以下のSQLを見てください:
select tb1.col1, tb2,col2
from tb1 inner join tb2 using(col3)
where tb1.col1 in (5,6)
彼の実行順序(擬似コード):
List outerDataList = "select * from tb1 where col1 in (5,6)"
for(outerData in outerDataList){
List innerDataList = "select * from tb2 where col3 = outerData.col3"
for(innerData : innerDataList){
output(outterData,innerData)
}
}
MySQLはと信じているすべてのクエリは、クエリに関連付けられているクエリは、テーブルには、上記のプロセスにも適しているが、上記のみ外層の基本的な操作を完了する必要がある場合は、。
のは、見てみましょうleft outter join
次のように、プロセスSQLのクエリーを:
select tb1.col1, tb2,col2
from tb1 left outer join tb2 using(col3)
where tb1.col1 in (5,6)
擬似コードは次のよう:
List outerDataList = "select * from tb1 where col1 in (5,6)"
for(outerData in outerDataList){
List innerDataList = "select * from tb2 where col3 = outerData.col3"
if(innerDataList != null){
for(innerData : innerDataList){
output(outterData,innerData)
}
}else{
// inner表无对应数据,以outter数据为准
output(outterData,null)
}
}
しかし、このトラバーサルクエリは、次のような関節の問い合わせのすべて、満たすことができないのクエリ(完全外部結合)「完全外部結合を」 MySQLは完全な外部クエリをサポートしていません理由とすることができる、達成するために、このメソッドを使用することはできません~~~
2.最適化
次のような4つのテーブルユニオンクエリコマンドツリーとしてMySQLが、クエリコマンドツリーを生成します。
MySQLは最初の命令ツリーを生成する前に評価するために、SQL文の効率を実行します、彼は関連性の最も効率的な実行順序を選択し、次に考えました。次のSQLの場合:
EXPLAIN SELECT
actor.NAME,
film.title
FROM
actor actor
INNER JOIN film_actor USING ( actor_id )
INNER JOIN film USING ( film_id )
実行計画から分かるように、MySQLはデータ及び順次走査film_actorを取得するために第一の対応テーブルとしてフィルムを選択し、アクターテーブルフェッチ。MySQLのオプション戦略は少ないクエリの実行を作ってみることですネストされたループやバックトラック操作をので、彼はデータ外部クエリの少ない量にしようとします。フィルムテーブルのみ4つのレコードを持っているので、俳優のテーブルが6つのレコードを持っているので、私は最初の表として選択されたフィルムは、より高い効率を問い合わせるようになったと思います。
しかし、MySQLの最適化戦略は、それよりも複雑なの実行のすべての順序のコストを計算します、MySQLはその後、彼は考えた最適な実行計画を選択します。テーブル共同問い合わせが多い場合は、彼はすべての必然網羅実装は、最良執行戦略を選択していないので、このデフォルトの最適化は必ずしも常に最善の方法ではありません。以上、一例としてのSQLよりも、フィルムfilm_idテーブルのフィールドのインデックスの確立は、フィールドは最初のテーブルとしてテーブルを照会することができる俳優を使用して、フィルム上の俳優よりも小さい場合であっても仮定する、ネスティングのより効率的な(内層)フィルム・テーブル・データを照会するときは、インデックスを使用することができます。ご注文のより高度な実装があると思われる場合は、使用できるSTRAIGHT_JOIN
キーワードは強制的にクエリー配列を実行します。
EXPLAIN SELECT
actor.NAME,
film.title
FROM
actor actor
STRAIGHT_JOIN film_actor USING ( actor_id )
STRAIGHT_JOIN film USING ( film_id )
注意:人間の判断よりも、ほとんどの時間を正確にMySQLを作るために、ほとんどの時間、順序を強制することは推奨されません。