MySQLのインデックスチューニング深さ

テーブルのテストのテストを作成します。

CREATE TABLEの`test`(
  ` id`のint(11)NOT NULL AUTO_INCREMENT、
  `c1` VARCHAR(10)DEFAULTのNULL、
  ` c2` VARCHAR(10)DEFAULTのNULL、
  `c3` VARCHAR(10)DEFAULTのNULL、
  ` c4` VARCHAR(10)は、デフォルトのNULL、
  `c5` VARCHAR(10)は、デフォルトのNULL、
  PRIMARY KEY(` id`)、
  KEY `idx_test_c1234`(` c1`、 `c2`、` c3`、 `c4`)
)ENGINE = InnoDBのDEFAULT CHARSET = utf8の;

`test`(` id`、 `c1`、` c2`、 `c3`、` c4`、 `c5`)の値( '1'、 'A1'、 'A2'、 'A3'、「A4への挿入」、 'A5');
`test`(` id`、 `c1`、` c2`、 `c3`、` c4`、 `c5`)の値( '2'、 'B1'、 'B2'、 'B3'、「B4への挿入」、 'B5');
`test`(` id`、 `c1`、` c2`、 `c3`、` c4`、 `c5`)の値( '3'、 'C1'、 'C2'、 'C3'、「C4への挿入」、 'C5');
`test`(` id`、 `c1`、` c2`、 `c3`、` c4`、 `c5`)の値( '4'、 'D1'、 'D2'、 'D3'、「D4への挿入」、 'D5');
`test`(` id`、 `c1`、` c2`、 `c3`、` c4`、 `c5`)の値( '5'、 'E1'、 'E2'、 'E3'、「E4への挿入」、 'E5');

インデックス・ケースの使用の以下の分析

ケース1

次のSQL文を実行します。

①テストC1 = A1 '' AND C2 = 'A2'およびC3 = 'A3' AND C4 = 'A4' SELECT * FROMをEXPLAIN
②テストFROM C1 = 'A1'およびC3 = 'A3' AND C2 * SELECTをEXPLAIN = 'A2'とC4 = 'A4'
③テストSELECT * FROMをEXPLAIN C1 = 'A1'とC4 = 'A4' AND C3 = 'A3' AND C2 = 'A2'
④テストSELECT * FROMをEXPLAIN C4 =」 A4' AND C2 = 'A2'およびC3 = 'A3' AND C1 = 'A1'

分析:C1、C2、C3、C4の順の関節指数の作成は、4つのグループは、結果が同じで説明:種類= REF、key_lenに= 132、REF =定数、CONST、CONST、CONST。

結論:インデックス列の順序を変更し、同等の一定のクエリを実行すると、基本となるオプティマイザは自動的にMySQL用に最適化されますので、結果が、説明は変更されませんが、それでも書き込みSQL文の列にインデックス順をお勧めします。

ケース2

SQLステートメントを実行:SELECT * FROMテストEXPLAIN C1 = 'A1' AND C2 = 'A2'

执行SQL语句:テストSELECT * FROMをEXPLAIN C1 = A1 '' AND C2 = 'A2'およびC3> 'A3' AND C4 = 'A4'

分析:= 99 key_lenに存在範囲、タイプ=範囲は、インデックス上ではなく、ケース1の結果、故障インデックスC4の指示とは対照的に、所与= 66以上key_lenに、の範囲を増加させます。

結論:右範囲インデックス列の障害が、現在の位置(C3)の範囲のインデックスに有効である key_lenに= 99から証明可能な、。

ケース2.1

执行SQL语句:テストSELECT * FROMをEXPLAIN C1 = A1 '' AND C2 = 'A2'とC4> 'C4' AND C3 = 'A3'

分析:(C1 '=「A1」及びC2 =「A2」及びC3 =用に最適化され、従って、このSQL文を最適化する最適化された下地のMySQLであろう4つのインデックスが記載key_lenに= 132の用途、上記の比較を行った結果を説明A3「AND C4>」C4「):障害範囲欄(列インデックスの権利はありませんC 4)の右、ノートシーケンスのインデックス(C1、C2、C3、C4)は、その右側にはC4インデックス付きの列が表示されますが失敗しないことを、だから、すべての4つの指標を過ごします。

結論:範囲欄障害の右の順序である:C1、C2、C3、C4 、 C3範囲、C4障害がある場合、C4は範囲を持っている場合、完全なインデックスを使用するインデックス列のない障害はありません。

ケース 2.2 :(免責事項:調査対象の解釈の場合)

执行SQL语句:テストSELECT * FROMをEXPLAIN C1> 'A1' AND C2 = 'A2'およびC3 = 'C3' AND C4 = 'A4'

分析:あなたは= ALL、キー= NULL、インデックスが失敗し、C1は主に範囲ではなく、照会のために使用されているので、最高の左プリフィックスの原則に反して、鉛の兄弟は、死んで全表スキャンを入力し、C1での範囲を使用している場合。

解決方法:カバーインデックス。

結論:最高の左プリフィックス索引の原理は、最前線の一番左の場合(リード兄弟)インデックスは、インデックスの背中の失敗を失敗しました。

ケース3

执行SQL语句:テストSELECT * FROMをEXPLAIN C1 = A1 '' AND C2 = 'A2'とC4 = 'A4' ORDER BY C3

分析:ベスト左接頭原理の使用:中間兄弟が破壊することができないので、c1とc2インデックス(外観)を使用し、key_lenに= 66、REF =定数、CONSTを見ることができるから、C3は列がソート処理によってためにも使用されるインデックス付け(また、インデックスに使用されるC3)。

質問:C3によって順序を証明する方法は、インデックスを使用しましたか?

执行SQL语句:テストSELECT * FROMをEXPLAIN C1 = A1 '' AND C2 = 'A2'とC4 = 'A4' ORDER BY C5

分析:C5によって順序と順序は、余分な列がfilesortレコードを使用して登場C5非インデックスフィールドには、ファイルの並べ替えを使用するため、指標と低パフォーマンスを使用していないに代わって発注。

ケース3.1

执行SQL语句:テストSELECT * FROMをEXPLAIN C1 = A1 '' AND C2 = 'A2' ORDER BY C3

分析:key_lenに= 66、REF =定数からは、constが、見ることができる唯一のソートにインデックスC1とC2、C3のインデックスを使用見つけること。

ケース3.2

执行SQL语句:テストSELECT * FROMをEXPLAIN C1 = A1 '' AND C2 = 'A2' ORDER BY C4

分析:key_lenに= 66、REF =定数、CONSTが見ることができる、それはソートに使用C4によるC1とC2インデックスは、断続的に、C3をスキップ使用し、ソートC4にインデックスを使用することはできません、表示されますから、使用filesortレコード。

ケース4

SQLステートメントを実行:SELECT *は、試験のEXPLAIN C1 = 'A1' = AND C5 'A5' ORDER BY C2、C3

分析:C1のみを検索するためにインデックスを使用し、C2、C3のインデックスがfilesortレコードを使用していない、ソートに使用されています。

ケース4.1

SQLステートメントを実行:SELECT *は、試験のEXPLAIN C1 = 'A1' = AND C5 'A5' ORDER BY C3、C2

分析:ケース4との結果が同じ説明が、C1、C2、C3、C4が、C2およびC3をソートするためのインデックス作成順序は位置を逆転しているため、filesortレコードを使用してありました。

ケース4.2

执行SQL语句:WHEREテストSELECT * FROMをEXPLAIN C2、C3 BY C1 = A1 '' AND C2 = 'A2' ORDER

执行SQL语句:テストSELECT * FROMをEXPLAIN C1 = A1 '' AND C2 = 'A2' C2 BYとC5 = 'A5' ORDER、C3

分析:クエリC5の増加が、C5は、インデックスを作成していないので、結果は、説明のように。

ケース4.3

执行SQL语句:テストSELECT * FROMをEXPLAIN C1 = A1 '' AND C2 = 'A2' C3 BYとC5 = 'A5' ORDER、C2

分析:ケース4.1と比較すると、c2が一定であるため、余分な使用filesortレコードに表示されていない、順序に最適化されているので、インデックスが逆転されていない、それがfilesortレコードを使用して表示されません。

ケース5

执行SQL语句:テスト* FROM SELECTをEXPLAIN 、C1 = 'A1'とC4 = 'A4' GROUP BY c2とc3を

分析:インデックスを使用していないことでgourpが(一時的に使用して)一時テーブルを生成するためにつながる場合は、下のは最初の条件で、インデックスを使用して、グループにグループ化、ソート順を使用します満たしていることをインデックスを使用して、ソート順C4断続的に、左端のインデックス接頭辞の原理によれば、インデックスkey_lenに= 33、REF =定数、一つだけインデックスを使用表すからのみ、クエリ上記C1にインデックスを使用します。

ケース5.1

执行SQL语句:テスト* FROM SELECTをEXPLAIN 、C1 = 'A1'とC4 = 'A4' GROUP BY C3とC2

分析:スイッチング位置の比較ケース5、C2、C3の場合のグループによって、非常に過酷な(一時的な使用)によってグループを満たすこと、すなわち、できない、(filesortレコードを使用して)順に失敗をもたらします。理由:逆の順序でC3とC2とインデックスの作成。

ケース6

SQL文を実行:Test FROM WHERE * SELECTをEXPLAIN C1> 'A1' ORDER BY C1

分析:

①C1、C2、C3に、C4インデックスは、C1に直接範囲を使用して作成され、インデックスの失敗につながった、全表スキャン:タイプ= ALL、REF = NULL。この時点で、C1は、ソー​​トのために主に使用されているので、照会しません。

②使用c1は、ソー​​ト、filesortレコードを使用して登場しました。

③回避策:カバーインデックスを使用してください。

SQL文を実行:SELECT EXPLAIN C1を試験のC1> 'A1' ORDER BY C1

事例7

SQL文を実行します。

SELECT EXPLAIN C1をテストFROM C1 ASC、ORDER BY、C2 DESC

分析:列インデックス順序としてソート列なおとfilesortレコードを使用して生成するインデックスの別の種類で、その結果、下降にC2 DESCデフォルトによって昇順。

ケース8:

执行SQL语句:SELECT EXPLAIN C1をテストFROM WHERE C2、C3 BY C1に( 'A1'、 'B1')ORDER

分析:発注については、複数の等しい条件にも範囲クエリです。

要約: 

①MySQLは2つの方法でソートし、インデックスfilesortレコードサポートし、インデックス自体をスキャンインデックスMySQLを使用すると、ソートの完了を意味します。インデックス、高効率、低filesortレコード効率。

②二つの条件を満足することにより、順序はインデックスを使用して使用されます。

左端の最前線インデックスを使用するための声明による。オーダー。

B。左端の列のインデックス最前線を満たすために結合句の条件によって、where句と順序を使用してください。

③索引列の順序付けを完了しようとすると、最高の左プリフィックスの原則の確立は(インデックスの順序が作成された)インデックスを追いました。

条件によって順序がインデックスに記載されていない場合は④、それがfilesortレコードを使用して生成されます。

⑤その本質は、最初のグループの後にソートされたグループで、オーダー非常に類似したことで、そして、インデックスは最高の左プリフィックス順の原則に基づいて作成されます。なお、ここでHAVING画定する条件を定義するつもりはないに書き込む場所を有する上記。

式の人気の理解

私のお気に入りの試合、最も左接頭私の食べ物の完全な値。

ビッグブラザーに率先して死ぬことができない、ひもオフ真ん中の弟。

全範囲の後に終了少なく、計算列のインデックス、。

インデックスはスター、右駅たいパーセンタイルを書かないカバー。

そこにはnull値に至るまでや、インデックスはあまり使用しませんでした。

补充:in和exists优化

原则:小表驱动大表,即小的数据集驱动大的数据集。

in:当B表的数据集小于A表的数据集时,in优于exists

select * from A where id in (select id from B)

等价于:

for select id from B

for select * from A where A.id=B.id

exists:当A表的数据集小于B表的数据集时,exists优于in

select * from A where exists (select 1 from B where B.id=A.id)

等价于:

for select * from A

for select * from B where B.id=A.id

(A表与B表的id字段应建立索引)

おすすめ

転載: www.cnblogs.com/ZekiChen/p/12304913.html