MySQLのむンデックス䜜成の基本ずEXPLAIN機胜





Vasily Lukyanchikovによるレポヌトのトピックは、MySQLでのむンデックス䜜成ずEXPLAINの高床な機胜です。 私たちの仕事は、質問に答えるこずです。EXPLAINで䜕を芋぀けるこずができたすか、䜕に泚意を払うべきですか







EXPLAINの制限の倚くはオプティマむザヌに関連しおいるので、事前にアヌキテクチャを調べお、制限がどこから来お、原則ずしおEXPLAINで䜕ができるかを理解したす。







䞀般的な理論ずは察照的に、MySQLのニュアンスに぀いおのみむンデックスを簡単に説明したす。







したがっお、レポヌトは3぀の郚分で構成されたす。











ノァシリヌ・ルカンチコフスタニゎスト







MySQLアヌキテクチャ



抂略的に、サヌバヌは次のように衚すこずができたす。











最初のブロックは、通垞、TCP / IPたたはUNIX゜ケットを介しお、察応するコネクタたたはC APIの機胜を介しおサヌバヌにアクセスするクラむアントです。 接続制埡ナニットに到達したす。実際には、クラむアントはこの時点で承認され、承認および実行プロセスが開始されたす。 各クラむアントは、独自の独立したフロヌで動䜜したす。 远加のスレッドはサヌバヌによっおキャッシュされ、䜿甚されたす。







ク゚リキャッシュに぀いおは、すべおのクラむアントに共通の1぀のスレッドで衚されるこずに泚意する必芁がありたす。マルチコアアヌキテクチャず非垞に単玔なデヌタベヌスク゚リがある堎合は、ボトルネックになる可胜性がありたす。 デヌタベヌスはそれらを迅速に実行したす。キャッシュにアクセスする時間がボトルネックになる可胜性がありたす。これが唯䞀のスレッドであり、誰もがそのために䞊んでいるためです。







接続管理を䜿甚するず、芁求は、パヌサヌ、オプティマむザヌ、゚グれキュヌタヌの3぀の郚分で構成されるメむンパむプラむンに到達したす。 実際、この郚分は受信したSQLク゚リをデヌタ遞択に倉換したす。 この郚分は、それぞれのタスクに埓っお、ストレヌゞむンタヌフェむスず通信したす。









ここでは、MySQLに関連する重芁な機胜に泚意する必芁がありたす。これは接続されたストレヌゞむンタヌフェむスです。 䌚瀟で独自のストレヌゞ暙準むンタヌフェむスを開発しお接続できたす。 したがっお、さたざたなニュアンスを考慮しお、デヌタを最も䟿利な方法で保存できたす。







逆の機胜は、オプティマむザヌがリポゞトリず非垞に匱く接続されおおり、このリポゞトリたたはそのリポゞトリによるリク゚ストの䞀郚の実行の個々のニュアンスを認識せず、考慮しないこずです。 さらに、これは奇劙なこずですが、MySQL開発者によっお盎接開発されたメむンリポゞトリでもひどく起こりたす。この状況は最新バヌゞョンでのみ改善され始めたした。 この点を考慮する必芁がありたす。







たた、MySQLのむンデックスはストレヌゞレベルで正確に実装され、暙準化されおいないこずにも泚意しおください。 したがっお、どのタむプのむンデックスフルテキスト、Bツリヌ、空間などが1぀たたは別のストアで䜿甚されおいるかを監芖する必芁がありたす。 そしお最も重芁なこず異なるリポゞトリの同じむンデックス-それは完党に異なる構造である可胜性がありたす。 たずえば、MyISAMのBツリヌむンデックスにはデヌタ自䜓ぞのポむンタヌが栌玍され、InnoDBにはプラむマリキヌぞのポむンタヌが栌玍されたす。 MyISAMはプレフィックスむンデックスを圧瞮したすが、InnoDBは圧瞮したせんが、デヌタずむンデックスの䞡方をキャッシュしたす。







䜜業䞭に考慮する必芁がある倚くのニュアンスがありたす。 あるストレヌゞでの実行が高速なリク゚ストもあれば、別のストレヌゞでのリク゚ストも高速です。 統蚈の保存方法は異なりたす。 たずえば、MyISAMの堎合のリク゚ストカりント*は、デヌタ自䜓にアクセスせずに非垞に迅速に実行できたす。 統蚈はメタデヌタに保存されたす。これは特別な堎合に圓おはたりたすが、それでもそのようなニュアンスがありたす。







ク゚リプランに぀いお蚀うだけです。 オプティマむザヌが実行したす。これは䜕らかの実行可胜コヌドではなく、゚グれキュヌタヌに枡す䞀連の呜什です。 これは、リク゚ストの実行方法に関する提案です。 ゚グれキュヌタヌがリク゚ストを行った埌、いく぀かの違いが珟れる堎合があり、PostgreSQLずは異なり、MySQLは䜕が行われたかを衚瀺したせん。぀たり、MySQLでEXPLAINを芋るず、ANALYZEがありたせん。 より正確には、最近ベヌタ版であり、もちろんただ䜿甚されおいないMariaのバヌゞョン10.1に登堎したした。 したがっお、MySQLでEXPLAINを芋るずき、これらはいく぀かの仮定であるこずに泚意しおください。







倚くの堎合、同じ蚈画であるがパフォヌマンスが異なるような状況がありたす。 ここで、EXPLAINの芳点からオプテ​​ィマむザ自䜓が提䟛するものはほずんどないこずに泚意しおください。 たずえば、テヌブルからク゚リを遞択し*、テヌブルからフィヌルドのペアを遞択するず同じプランになりたすが、1぀のケヌスでは各レコヌドに数KBを遞択し、もう1぀のケヌスでは巚倧なレコヌドがある堎合は数MBになるこずがありたす。 圓然、これらのリク゚ストのパフォヌマンスは桁違いに異なりたすが、蚈画ではこれが瀺されたせん。 たたは、同じプラン、1぀のク゚リがありたすが、異なるマシンで異なる方法で実行されたす。ある堎合にはむンデックスがメモリから読み取られ、別の堎合にはバッファが小さい堎合、むンデックスはディスクから取埗されるためです。 繰り返したすが、同じ蚈画でもパフォヌマンスは異なりたす。 そのため、EXPLAINに加えお、たずサヌバヌパラメヌタshow statusでさたざたなこずを調べる必芁がありたす。







ここで過去のRIT ++䌚議を参照するのが適切です。そこでは、MySQLの怍物決定芁因に関するGrigory Rubtsovの報告がありたした。そこに。 叀兞的な怍物の決定芁因のように、怍物の定矩を怜玢するずき、圌らは葉の数、圢などに泚目したした。 そしお答えに来たした。 そのような構造がありたす-䞀貫しお芋える堎所、ボトルネックを芋぀けるために䜕をすべきか。









MySQLのむンデックスに移りたしょう







すべおのタむプのむンデックスを考慮しおリストするこずはしたせん-各デヌタベヌスのむンデックスは倚かれ少なかれ暙準です。 MySQLに぀いお蚀えば、次の点に泚意する必芁がありたす。MySQLは、重耇したむンデックスを管理したせん。 提瀺されたようにテヌブルを䜜成する堎合、列1に䞀意のプラむマリむンデックスを䜜成するこずを意味したせん。これは、1぀の列に3぀の同䞀のむンデックスを䜜成するこずを意味したす。 3぀すべおがスペヌスを占有し、曎新され、オプティマむザヌによっお考慮されたす。MySQL自䜓は譊告を発行したせん。 自分で芋る必芁がありたす。







むンデックスに぀いおは基本的には、bツリヌを最もよく䜿甚したす、詳现に入らないように、たたツリヌを描画しないように、アルファベット順のむンデックスの圢匏でむンデックスを衚すのが非垞に䟿利です。 たずえば、アドレス垳はテヌブルであり、アドレス垳ぞのむンデックスはむンデックスです。 この類掚を䜿甚しお、むンデックスがどのように機胜するかを想像できたす。デヌタがより速く遞択されるなどです。しかし、MySQL自䜓には若干の違いがありたす。MySQLは垞にむンデックスに沿っお進むため、これにより疑問が生じる堎合がありたす。











たずえば、アルファベット順のむンデックスでいく぀かの名前を芋぀ける必芁がある堎合。 「手」では、次のように怜玢したす。最初の姓を芋お、必芁な名前を芋぀け、次の姓たでスクロヌルしたす。 これは、bツリヌツリヌの制限ではなく、MySQLでのbツリヌツリヌの実装の制限です。 他のデヌタベヌスはこれを行うこずができたす-たずえば、WHERE B = 3の堎合、最初の列ではなく䜿甚するため、䞀般にMySQLでむンデックスは䜿甚されたせん。 特定の堎合にのみ、この列から最小倀ず最倧倀を芁求したすが、これはむしろ䟋倖です。







䞊蚘のスラむドでは、さたざたなオプションが提瀺されおいたすが、最初の䞍等匏でむンデックスが途切れるこずに泚意しおください。 最初の䞍等匏たで巊から右に順番に䜿甚されたす。 䞍等匏の埌、むンデックスのそれ以降の郚分は䜿甚されなくなりたす。 ぀たり 条件Aでは定数、Bは範囲、最初の2぀の郚分が䜿甚されたす。 2番目の堎合、むンデックス党䜓が䜿甚されたす。 3番目のケヌスでは、むンデックスも完党に䜿甚されたす。 条件内の定数の順序は重芁ではなく、サヌバヌはそれらを再配眮できたす。 B = 3の堎合、䞀般にむンデックスは䜿甚されたせん。 定数および䞍等匏の堎合、むンデックスは最初の2぀の郚分にのみ䜿甚され、むンデックスは3番目の郚分に䜿甚できたせん。 ケヌスA-定数で、最埌で゜ヌトするず、最初の郚分でのみむンデックスが䜿甚されたす。2番目の郚分がスキップされるため、最埌から2番目のむンデックスが完党に䜿甚されたす。 たた、埌者のバヌゞョンでは、むンデックスは最初の郚分にのみ䜿甚されたす。これは、むンデックスを゜ヌトするために䜿甚できるのは䞀方向に限られおいるためです。







これは、MySQLの耇合むンデックスは、実際には、それぞれ着信列の連結に察する通垞のbツリヌむンデックスであり、タプル党䜓の昇順たたは降順で移動できるためです。 したがっお、「Bの増加ずCの枛少に動いおいる」ず蚀うこずはできたせん。 これはMySQL固有の制限です。







そのようなニュアンスがありたす。 たずえば、0,1のAず0ず1の間のAは同等の圢匏であり、これはあちらこちらの範囲ですが、この0,1のAがリストの堎合、そうではないず理解したす範囲、および等匏の耇数条件を眮き換えたす。 この堎合、むンデックスを䜿甚したす。 これは、MySQLのもう1぀のニュアンスです。 リストたたは<>を䜿甚しお、蚘述方法を監芖する必芁がありたす。 圌はそれを区別したす。







冗長構文に぀いおのいく぀かの蚀葉。 むンデックスAずむンデックスA、Bがあれば、むンデックスA、Bの堎合はパヌトAを䜿甚できるため、むンデックスAは䞍芁です。 したがっお、冗長なむンデックスがないこずを確認し、自分で削陀する必芁がありたす。 明らかに、これは䞡方のむンデックスがbツリヌである堎合にも圓おはたりたすが、たずえばむンデックスAがフルテキストの堎合、もちろん必芁な堎合がありたす。







リストのニュアンスに戻りたしょう。 ここで、より広いむンデックスを䞀意にするこずができたす。 たずえば、むンデックスA、Bを䜜成する堎合、単玔に条件Bを䜿甚したせんが、可胜性のある小さなリストオプションがある堎合は、䞍足しおいる条件を独自に眮き換えるようにアプリケヌションで䜜成できたす。 しかし、この掚奚事項では、リストが存圚する堎合、むンデックスのさらなる䜿甚が砎棄されないずいう事実にもかかわらず、゜ヌトに䜿甚できないため、非垞に泚意する必芁がありたす。 平等のためだけに。 したがっお、䞊べ替え芁求がある堎合、䞊べ替えを䜿甚するためにリストが存圚しないように、すべおを結合しお芁求を再構築する必芁がありたす。 圓然、これは垞に可胜ずは限らず、垞に䟿利ずは限りたせん。 たずえば、むンデックスの拡匵子によっおむンデックスカバヌを䜜成できる堎合ク゚リで遞択および䜿甚されるすべおのフィヌルドがむンデックスに存圚するこずを意味したす、サヌバヌはデヌタのテヌブルに登る必芁がないこずを理解し、芁求したすむンデックスに結果を圢成したす。 なぜなら むンデックスはより合理化され、コンパクトで、ほずんどの堎合キャッシュされたメモリに保存されたす。これはより䟿利です。 したがっお、むンデックスをコンパむルするずきは、ク゚リのカバヌむンデックスを䜕らかの方法で遞択できるかどうかを垞に確認したす。







さらに、むンデックスを䜿甚しない堎合を怜蚎したす。











他のデヌタベヌスには共通の埮劙な違いがありたす。たずえば、PostgreSQLのようにむンデックスが匏の䞀郚である堎合、倉換できたせん。したがっお、ク゚リにid + 1 = 3がある堎合、idのむンデックスは䜿甚されたせん。 私たちは自分でそれを負担しなければなりたせん。 むンデックスが匏の䞀郚である堎合、むンデックスを明瀺的に陀倖できるように倉換できるかどうかを確認する必芁がありたす。







同様に、倉換を実行しないずいう事実のため数孊的なだけでなく、゚ンコヌドの䞍䞀臎、型倉換など、むンデックスも䜿甚されたせん。 サフィックス怜玢が進行䞭の堎合、最初の郚分がスキップされるずき、むンデックスは䜿甚されたせん。 もちろん、同様のテヌブルのフィヌルドず比范する堎合、むンデックスは䜿甚されたせん。この堎合、比范するために最初にテヌブルからレコヌドを読み取る必芁があるためです。







その前に、むンデックスをカバヌするこずず、それらがどのように優れおいるかに぀いお蚀及したした。 アヌキテクチャスラむドに戻る











これは次のように発生したす。請負業者は、店舗にデヌタWHERE条件をそれぞれ芁求したす。耇数のポゞションにWHERE条件がある堎合、それらはすべお店舗内で凊理できたす。 これが最適なオプションです。 条件の䞀郚がむンデックスによっおストレヌゞレベルで凊理され、サヌバヌがレベルアップに枡された行を適甚し、それ以䞊の条件を砎棄するオプションがありたす。 明らかに、これは遅くなりたす、なぜなら レコヌド自䜓がリポゞトリから実行者に転送されたす。 したがっお、むンデックスをカバヌするこずは、ク゚リ内のフィヌルドにのみ適甚する堎合、より有益です。なぜなら、 すでにより少ない行を遞択しおいたす。







ここで、たずえば、むンデックス条件プッシュダりンず呌ばれる同様の最適化











次の意味です。 A、B、Cの3぀のフィヌルドにむンデックスがありたす。このような条件䞋では、最初のフィヌルドの䞀郚のみを䜿甚できたす。 リポゞトリ自䜓のむンデックスをチェックできるように思えたすが、以前MySQL 5.6、MariaDB 5.3より前はサヌバヌがこれを実行しおいなかったため、特定のリリヌスサヌバヌが実行できるこずを泚意深く調べる必芁がありたす。 新しいバヌゞョンでは、サヌバヌは列Aのみでむンデックスの最初の郚分を怜玢し、デヌタを遞択したす。レコヌドを゚グれキュヌタヌに送信する前に、2番目ず3番目の郚分の条件を確認し、レコヌド党䜓を遞択するかどうかを確認したす。 これにより、ディスクから読み取る必芁があるレコヌドの数が自然に枛少したす。







InnoDBの䞻芁な機胜は、セカンダリキヌがプラむマリキヌを参照するため、実際にはInnoDBのセカンダリキヌはセカンダリキヌ+プラむマリキヌぞのポむンタです。











このような長いむンデックスには目に芋えない尟がありたす。 オプティマむザヌがアクションでそれを考慮しなかったずいう意味で目に芋えたせん。







したがっお、プラむマリA、Bコンポゞット、セカンダリキヌがありたす-これはC、A、Bのコンポゞットキヌになり、既に怜玢できたす。







したがっお、InnoDBテヌブルを䜿甚しおむンデックスを䜜成する堎合、すべおのむンデックスに远加されるため、䜿甚するク゚リに応じお、長いプラむマリキヌが良いか悪いかを垞に考慮する必芁がありたす。







次の譊告がありたす-この最適化は、文字列のフィルタリングに぀いおのみ考慮されたす。 セカンダリキヌの倀のみが゜ヌトされた圢匏で保存され、プラむマリキヌぞのポむンタは゜ヌトされないため、サヌバヌは等しい文字列フィルタリングの条件にのみこのような長く芋えない「テヌル」を䜿甚できたす。 MariaDB 5.5、MySQL 5.6で利甚可胜です。







オプティマむザヌの䞻な制限は、歎史的にほずんど統蚈を䜿甚しないこずです。 リポゞトリからのデヌタを芁求したす。 ここで、サヌバヌが考慮に入れるものをより詳现に瀺したす。











入力コマンド、フィヌルド、行数の結果を考慮するこずができたす。 倧量のデヌタ。 特城は、最初に統蚈が次のように蚈算されるこずですサヌバヌを起動するか、䜕らかのALTERコマンドを䜜成し、統蚈を曎新したす。その埌、テヌブルがしばらくの間存続し、プロセスが突然倉化し、統蚈が再び曎新されたす。 ぀たり 統蚈自䜓がデヌタの分垃に察応しないこずが起こりたす。







繰り返したすが、各ストアは独自の方法で統蚈を遞択したす。 最新バヌゞョンでは、独立した統蚈、぀たり サヌバヌレベルでの統蚈-サヌビステヌブルが割り圓おられ、Percona 5.6の堎合、ストレヌゞメカニズムに関係なく、すべおのテヌブルの統蚈が統䞀された方法で収集されたす。 これはInnoDBのむンデックスに察しおのみ行われたす。Maria10では、むンデックス化されおいない列に぀いおもさらに収集し、デヌタの分垃をよりよく理解しおいるため、オプティマむザヌはより最適な実行プランを遞択できたす。







オプティマむザヌはリポゞトリの機胜を考慮したせん。リク゚ストをリポゞトリに転送するず、InnoDBがセカンダリキヌをより長く怜玢するこずは明らかです。セカンダリキヌを調べ、プラむマリキヌぞのポむンタを取埗し、これらのポむンタを取埗し、デヌタを取埗するためです。぀たり ダブルパスを䜿甚したす。たずえば、MyISAMでは、行自䜓を盎接指すポむンタヌがすぐに存圚したす。 オプティマむザヌは、これらの郚分たたはそれらの郚分の盞察的な速床の同様のニュアンスを考慮したせん芁求は異なるリポゞトリヌに同時に適甚できたす。 たた、機噚に関連する倚くの問題も考慮しおいたせん。 キャッシュしたデヌタ、バッファ...







メトリック。 オプティマむザヌが最も安いプランを遞択するこずは明らかですが、オプティマむザヌの芳点から芋るず、最も安いプランは最もコストの䜎いプランであり、コストの問題は、それに関する私たちの考えず䞀臎しない慣習です。 繰り返したすが、遞択の難しさは、テヌブルがたくさんあり、それらを移動しお異なる方法で芋る必芁がある堎合です。







圌はたた、ルヌルを䜿甚しおいたす。 たずえば、フルテキストむンデックスを䜿甚する必芁があるこずを理解しおいる堎合は、䞻キヌに1぀の列を明確に生成する条件がある堎合でも、それを䜿甚したす。







ただそのようなニュアンスがありたす-これらの2぀の゚ントリは、私たちの芳点からは同等です







ここで、1ず4の間







ここで、a> 0およびa <5







しかし、MySQLサヌバヌの芳点からは、いいえ。 a> 0およびa <0の堎合、圌は範囲怜玢を䜿甚し、「between」を通じお同じものを蚘述する堎合、これをリストに倉換し、耇数の等匏の条件を䜿甚できたす。







このようなニュアンスでは、垞識に基づいおク゚リを䜜成するこずはできたせんが、䞀方で、MySQLを最適化するために特別に蚓緎された人々の需芁が増えるずいう点で䟿利です。 :)









オプティマむザヌの仕組みに぀いお簡単に説明したす



自明性の芁求をチェックしたす。 䞀般に、圌はむンデックス統蚈のみに基づいおリク゚ストを行うこずができたす。 ID列に負の倀正の倀を芁求しおいるのかもしれたせん。 その埌、圌はすぐに私たちが範囲倖で芁求しおいるこずを理解したす。 これはパフォヌマンスの点で非垞に効果的なオプションです。最も安いプランを遞択したす。







オプティマむザヌはほずんど䜕もできないように芋えたすが、実際にはさたざたな手法を䜿甚しおク゚リを数孊的に倉換したす。たずえば、サブク゚リは叀いバヌゞョンのように䜎䞋​​したり、独立した䟝存関係になったり、新しいもののように改善したりする可胜性がありたす。 テクニックのリストは非垞に長いです。







これは、MariaDBドキュメントの衚の始たりです。











これらすべおの単語の背埌にあるものを知る必芁があるので、MariaDBのドキュメントを参照するこずをお勧めしたす。 それには明確な写真、むラストが装備されおおり、それらから䜕が䜕に属しおいるかを理解できたす。







オプティマむザヌにどのように圱響を䞎えるこずができたすか

















SQL_CALC_FOUND_ROWSは、最適化を完党に無効にする恐ろしい単語です。 実際には、LIMITリク゚ストがある堎合、キヌワヌドをリク゚ストに含めるこずができ、サヌバヌは無制限に遞択される合蚈数を含むレスポンスを提䟛したす。 これは、たずえば、ペヌゞのペヌゞネヌションを行うずきに䟿利であり、すべおの自動システムがこれを匕き起こしたす。 MySQLはCOUNTク゚リを非垞にうたく最適化できるため、これは悪いこずですが、困難なケヌスでは、結合、グルヌプなどがある堎合、行数を個別にカりントし、結合の䞀郚が結合するようにク゚リを曞き換えるこずができたすグルヌプの䞀郚でも、ペヌゞの合蚈数に関する回答を埗る必芁はありたせん。







サヌバヌはリク゚ストごずに1぀のメ゜ッドのみを䜿甚したす。 FOUND_ROWSを远加するず、1぀のメ゜ッドで2぀の問題が解決されたす。 圌は実際にすべおの行を遞択したす。LIMITがない堎合は、ストレヌゞからデヌタを匕き出したす。すべおの長いレコヌドは、䜙分なものを砎棄するず信じおいたす...これは非垞に悪いこずです。 ここで、同じCOUNT*は行自䜓を読み取らず、デヌタをリヌダヌに枡さずに、可甚性の事実をスキャンするだけであるずいうこずを理解する必芁がありたす。







このレベルでは、理解するために詳现を知る必芁がありたす。そうしないず、単にEXPLAINを芋るだけではあたり意味がありたせん。











EXPLAINの欠点は、オプティマむザヌの欠点に起因したす。 EXPLAINが芁求を満たしおいないが単に蚈画を立おおいるず蚀うずき、䞀般に、圌がしおいるこずを曞いおいないが、ほずんど情報を出しおいないこずがありたす。 叀いバヌゞョンでは、サブク゚リから実行されおいたした。 圌はサブク゚リから䞀時的なサブテヌブルに具䜓化し、それらが重い堎合、サブク゚リからこれらを完了するのに倚くの時間がかかりたした。 たた、サブク゚リからデヌタを倉曎するナヌザヌ定矩関数が含たれる堎合があり、EXPLAIN自䜓もデヌタを倉曎するずいう事実ず矛盟がありたした。 なぜこれが必芁なのかは明らかではありたせんが、実際には人々は時々非垞に奇劙なこずを思い぀きたす。











EXPLAINの皮類



PARTITIONSキヌワヌドを䜿甚するず、ク゚リが䜿甚するセクションが衚瀺されたす。







EXTENDEDキヌワヌドは、実行プランから埩元されるSQLク゚リを生成するずいう点で䟿利です。 これは元のSQLク゚リではなく、元のSQLク゚リがプランに倉換され、オプティマむザヌによっおプランから新しいSQLク゚リが合成されたす。オプティマむザヌには、䜕が起こっおいるのかを理解できる倚くのヒントが含たれおいたす。 キヌを含む䞀時テヌブルの圢成、リク゚ストの䞀郚のキャッシュ-これらのニュアンスはすべおドキュメントに詳しく説明されおおり、サヌバヌの機胜、リク゚ストの倉換方法の理解に圹立ちたす。











実際、これは最も単玔なク゚リのEXPLAINです。







ここでは、次を確認する必芁がありたす。











さらに、すべおの可胜なオプションを詳现に怜蚎するこずはしたせん-これはドキュメントに詳しく説明されおいたす。







ク゚リに衚瀺されるテヌブルごずに1行を圢成し、テヌブルが衚瀺される順序でク゚リを実行するこずは明らかです。 EXPLAINを芋るず、次のテヌブルぞのアクセス順序が遞択されおいるこずがすぐにわかりたす。最初に郜垂テヌブルを遞択し、次に囜テヌブルを遞択したす。 ここではすべおが簡単です。







しかし、異なるUNION、FROMサブク゚リなどを含むEXPLAINのような耇雑なトリックがあり、長い「シヌト」が出力される堎合











質問が発生したす-それを読む方法







アむデアは非垞に単玔です。ク゚リに衚瀺されるすべおのSELECTに番号を付け、SELECT番号はEXPLAINにある識別子番号に察応したす。











わかりやすくするために、さたざたな色で匷調衚瀺したした。







2番目の譊告-数字を芋るこずができたす。 たずえば、6-DERIVEDはFROMサブク゚リです。 次のものには、より倧きな識別子が付いおいたす。 これは、同じFROMサブク゚リ、぀たり 同じ䞀時テヌブルに移動したす。 したがっお、識別子だけを芋るず、すでに倚くの結論を匕き出すこずができたす。







䞍䟿な点がありたす。行は順番に実行されるず蚀いたす。実際、ビュヌなどが存圚する堎合、これは完党に真実ではありたせん。 ぀たり UNIONを䜿甚したク゚リは、このように䟿利に読み取られたす。4぀のUNIONがありたす。぀たり、1〜4行目はUNIONの䞀郚に関連し、4番目から最埌は2番目の郚分を参照したす。 ぀たり 最埌の行を芋お䞊に行くこずができるので、ク゚リを分割できたす。 実際、これには耇雑なこずは䜕もありたせん。スキルが必芁です。







EXPLAINのグラフィカルな衚珟をすぐに構築するナヌティリティがありたすが、特に耇雑なク゚リの堎合は理解しにくいため、それらを考慮したせん。 これは皆のためです。







EXPLAINが嘘を぀いおいる䟋











䞀郚にサブク゚リを含むク゚リがありたす。 サブク゚リは独立しおいたすが、MariaDB 5.3およびMySQL 5.6より前のMySQLは倚くの堎合、これらのク゚リを䟝存ずしお実行しおいたした。 ク゚リのタむプは䟝存関係にありたすが、䞀方でindex_subqueryタむプは衚瀺されたす。これは、実際にはサブク゚リは実行されず、むンデックスビュヌ関数に眮き換えられるこずを意味したす。 ぀たり これらの行は互いに競合し、反察のこずに぀いお話したす。







質問が発生したす-実際に䜕が起こるのですか、なぜなら EXPLAINは矛盟する情報を生成したすか







プロファむリングをリク゚ストしお確認できたす











右のように、リク゚ストが䟝存しお実行される堎合、リク゚ストの実行の䞀郚であるデヌタ転送が耇数になり、耇補されたす。 ク゚リが個別に実行される堎合、これらの倀は耇補されたせん。







さらに、プロファむリングは、ビッグデヌタの転送、統蚈のカりントなどのニュアンスを決定するのに䟿利です。









仕分け







ORDER BY id LIMIT 10000の堎合、10は悪いため、 サヌバヌは1䞇行すべおを遞択し、さらに10行を遞択し、1001行目を削陀しお10行のみを提䟛したす。 そのようなこずは䜕らかの方法で倉曎する必芁がありたす。 たたは、IDが10,000を超えおおり、LIMIT 10です。サヌバヌが䜕をするかずいう点で、倧きな数を盞殺した堎合、これは悪いこずです。







ORDER BY randは䜿甚できたせん。この構造は、すべおのデヌタのコピヌを䜜成し、それを䞀時テヌブルにプッシュし、そこに別の列を远加し、そこにrand関数の結果を曞き蟌み、この巚倧な配列党䜓のファむル゜ヌトを行いたす。したがっお、ランダムな行を遞択する堎合、ORDER BY randは少量のデヌタでのみ䜿甚でき、倧量のデヌタではすぐにすべおのパフォヌマンスが䜎䞋したす。







デフォルトでは、グルヌプ化も゜ヌトを行うため、゜ヌトが䞍芁な堎合は、明瀺的に-ORDER BY nullを指定する必芁がありたす。







我々は既に䞊で議論しおきた残りの郚分。







そのような䟋











- . 10 , .. , . , “ ” join' . : . . , .







, 10 — 10 + , 10 + . , .. , . , , . , , , , , , , Using filesort, . Using filesort' — .











, : , - , . , - , .







, UNION' from . , , .. , UNION', + , . , , .







ORDER BY + LIMIT , WordPress.











— , , .. , 3 . , , Using filesort . なぜなら , , .. , , , , .. 2 .











, . , , , category_ID=1, , , . . , , , 3 , .











Using filesort, , — . show status , , 95 . , . key bufer size, , . , , , , .







, .











, .., , , , , 2 (, ). - .







, — EXPLAN', .







ANALYZE statement — , PostgreSQL , MariaDB 10.1, beta.







SHOW EXPLAIN, MariaDB EXPLAIN . .







SQLinfo.ru/forum/フォヌラムで質問をするこずができたす。



All Articles