この章では、TiDBに次のソースを関連付けます:
表1.どのように走査変換オペレータスイープインデックス演算子へ。
選択オペレータは、インターバルスキャンに、簡素化をフィルタリングする方法2。
私たちは、テーブルがあるとします。
T1( 識別INT主キーではないヌルAUTO_INCREMENT、整数、 bは整数、 Cはvarchar(256 )、 インデックス() )。
ここで、IDはインデックスであり、主キーです。
私たちは、次のSQLを実行します。
選択から、T1 = 5または(> 5とを(> 6及び< 8)と< 12)。
この計画のSQLの最後の実行は、この次のとおりです。
+ --------------- + -------- + ----------- + ------------ -------------------------------------------------- --------- + | ID | カウント| タスク| オペレーター情報| + --------------- + -------- + ----------- + ------------ -------------------------------------------------- --------- + | IndexReader_6 | 260.00 | ルート| インデックス:IndexScan_5 | | └─IndexScan_5| 260.00 | 警官[tikv] | 表:T1、インデックス:範囲:[5,5]、(6,8)、キープ順序:偽、統計:擬似| + --------------- + -------- + ----------- + ------------ -------------------------------------------------- --------- +
これは、索引スキャンの実行計画である、索引スキャン間隔は、[5,5]、(6,8)です。
私たちは、そのような計画がどのように生成されるかを確認するために、ソースコードにアクセスしてください。
これは、最初のSQL実行計画を解析した後に生成されます。
論理最適化を行いlogicalOptimize関数を呼び出した後、実行計画は、このように書きます:
選択オペレータどこへ行きますか?
選択オペレータDataSourceがデータソースpushedDownCondsにおけるフィルタの演算子プッシュダウンを保存し、オペレータにプッシュダウンされ、ようなものです:
このような再帰的フィルタ演算子ツリーインデックスがインデックスは下の順であるため、そうツリーを切り替えるため、使用することは困難でスキャンし、スキャン間隔。
物理的な最適化では、生成がDetachCondAndBuildRangeForIndexスキャン間隔を呼び出し、この関数は再帰的に次の2つの関数と呼ばれています。
detachDNFCondAndBuildRangeForIndexは、選言標準形(DNF)、合わせたスキャン間隔またはスキャン間隔を生成する展開します。
detachCNFCondAndBuildRangeForIndex、合成走査期間または走査間隔を生成する、CNF(CNF)を展開。
上記式ツリーは、最終的に生成され、このような区間[5,5]、(6,8)---は、「[」再帰が解消され、「(」、閉区間開放部です。
次に、別のアプローチスキャン、インデックスはデータソースのアクセスリストに追加されます。
二つの選択肢があるデータソースpossibleAccessPathsでテーブルにアクセスするための可能な解決策割引:
1.フルテーブルスキャン、フィルタ式ツリーを持つ:= 5または(> 5及び(> 6及び<8)と<12)。
列インデックスを掃引2.スキャン区間[5,5]、(6,8)を行います。
物理的な最適化フェーズは、木のオペレータのルートから各再帰呼び出しfindBestTask演算子のために機能し、possibleAccessPathsから最適な実行計画を取得しますDataSoure演算子。
優れた実施計画を決定し、最終的にはデータソース演算子を置き換えるために、インデックススキャンオペレータとするために、複数の次元からアルゴリズムを剪定ここで使用スカイライン、。
最終的な実行計画を生成します。
エンド;