SQL ServerからMySql(8):Mysqlへのクエリー実行
4018 ワード
1.クライアント/サーバ通信プロトコル「半二重」:同じ時刻に一方向のデータ送信しか発生しない. の利点は、単純で迅速な です.制限:流量制御ができない. クライアントは、クエリーを別のパケットでサーバに渡す、結果を待つしかなく、戻り結果全体を完全に受信しなければならない.途中でデータ受信を停止することはできない. だからmax_allowed_packetパラメータ、およびクエリ文のlimit制限は特に重要である.
Mysqlは、すべてのデータがクライアントに送信されるまで、このクエリー・ロックが占有するリソースを解放することはできません. は、クエリーを早期に終了することができ、サーバの圧力を低減することができる. しかし、結果セットが大きい場合、より多くの時間とメモリがかかる.
ライブラリ関数がクエリを処理するのに要するメモリと時間を節約する. の欠点は、クライアントと対話する全過程でサーバリソースを占有することである.
Mysql接続(スレッド)の状態 sleep, query, locked, analyzing and statistics, coping to tem table, sorting table, sending data.
2.クエリー・キャッシュクエリー文を解析する前に、クエリーキャッシュが開いている場合、Mysqlはクエリーキャッシュのデータにヒットしたかどうかを優先的にチェックする. 検査は、大文字と小文字に敏感なハッシュ検索によって実現する. ヒットがある場合は、ユーザ権限を再確認する. 問題がなければ、後続のフェーズをスキップし、キャッシュから直接結果を取得してクライアントに返す.
3.クエリー最適化処理プロセス:SQLを実行計画に変換し、その実行計画に従ってストレージエンジンと対話する. サブフェーズ:SQLを解析し、前処理し、SQL実行計画を最適化する. プロセス中のエラーは、クエリーを終了する可能性があります.
構文解析器と前処理 解析器は「解析木」を生成する. プリプロセッサはMysql規則に基づいて解析ツリーが合法かどうかをさらに検査する.
クエリー・オプティマイザ クエリーには複数の実行方法があり、最後に同じ結果を返す. オプティマイザは、その中から最高の実行計画を見つけます. Mysqlはコストベースのオプティマイザを使用する.コストを評価する際、どのレベルのキャッシュも考慮しない. オプティマイザ選択エラーの原因:
Mysqlで処理できる最適化タイプ 関連テーブルの順序を再定義する. は、外部接続を内部接続に変換する. は等価変化ルールを用いる. Count,Min,Max関数を最適化する. は、推定する定数式に変換する. はインデックススキャンを上書きする. サブクエリの最適化 クエリーを事前に終了します. 等値で伝播する. リストIN()の比較. 多数のデータベースのIn()は複数のOR条件の句に完全に等しく、その複雑度はO(n)である. Mysqlはまずソートし、リスト値が条件を満たすかどうかを2分検索します.複雑度はO(log n)である.
� データとインデックスの統計情報.
Mysqlの関連クエリー. Mysqlの概念では、各クエリは1回の関連付けである. では、一連の単一クエリー結果が一時テーブルに格納され、ネストループ関連付けが実行される.
//**********は下記のコードに変換されて**********************outerを実行しますiter = iterator over t1 where... outer_row = outer_iter.next while outer_row inner_iter = iterator oever t2 where .... inner_row = inner_iter.next while inner_row .... inner_row = inner_iter.next end outer_row = outer_iter.next end
,
2.クエリー・キャッシュ
3.クエリー最適化処理
.
(アクセスデータのコストが異なる). .
. 例えば、記憶処理やユーザ定義関数を実行するコストである. .
Match()が存在する場合、他のインデックスがより速くなるとしても、必ず全文インデックスが使用される.Mysql
. 私たちが望んでいるのは最も速いが、Mysqlはコストベースで最も優れているだけだ. , . , , .
, .
select t1.c1, t2.c2 from t1
inner join t2 Using (c3) where ...;
//**********は下記のコードに変換されて**********************outerを実行しますiter = iterator over t1 where... outer_row = outer_iter.next while outer_row inner_iter = iterator oever t2 where .... inner_row = inner_iter.next while inner_row .... inner_row = inner_iter.next end outer_row = outer_iter.next end
* , .
* ` , . Mysql .`
* full join : = + + .
*
* Mysql , , .
* , .
*
* Mysql , .
* .
* , , " " .
* 10 ,. 3628800 .
*
* , Mysql , ( , , ).
* , , " " , merge.
* .
* ( )
* , . .
* ( )
* , , .
* `Mysql , . � .`
### 4
* , ( ). .
* : .
### 5
* , , .
* ` , . � , .`
* : . .