1つは、ストレージエンジン
- 前回の記事では、MySQLデータベースの独自のプラグインアーキテクチャについて学び、ストレージエンジンがMySQLを他のデータベースと区別する最も重要な機能の1つであることを学びました。ストレージエンジンの利点は、各ストレージエンジンに独自の特性があり、特定のアプリケーションに応じて異なるストレージエンジンテーブルを確立できることです。
- MySQLデータベースのオープンソース機能により、ユーザーはMySQLの事前定義されたストレージエンジンインターフェイスに基づいて独自のストレージエンジンを作成できます。ユーザーが特定のストレージエンジンのパフォーマンスや機能に満足できない場合は、ソースコードを変更して目的の機能を取得できます。これは、オープンソースがもたらす利便性とパワーです。たとえば、eBayのエンジニアであるIgor Chernyshevは、MySQLメモリストレージエンジン(http://code.google.com/p/mysql-heap-dynamic-rows/)を改善し、eBayのパーソナライズプラットフォームに適用しました。同様の変更には、GoogleとFacebookが含まれます。他の会社。もちろん、MySQLデータベース自体が提供するストレージエンジンは、ほとんどのアプリケーションのニーズを満たすのに十分です。
ストレージエンジンの分類
- MySQLデータベースのオープンソース機能により、ストレージエンジンはMySQL公式ストレージエンジンとサードパーティストレージエンジンに分けることができます
- よく知られているInnoDBストレージエンジン(最初のサードパーティストレージエンジン、後にOracleに買収された)など、一部のサードパーティストレージエンジンは非常に強力であり、そのアプリケーションは、MySQLデータベースOLTP(オンライントランザクション処理)でも非常に幅広いです。アプリケーション最も大規模なストレージエンジン。繰り返しになりますが、ユーザーは特定のアプリケーションに応じて適切なストレージエンジンを選択する必要があります。以下は、読者がストレージエンジンを選択するときに参照できる、いくつかのストレージエンジンの簡単な紹介です。
2、InnoDBストレージエンジン
- InnoDBストレージエンジンはトランザクションをサポートし、その設計目標は主にオンライントランザクション処理(OLTP)アプリケーションを対象としています。その特徴は、行ロックの設計、外部キーのサポート、およびOracleと同様の非ロック読み取りのサポートです。つまり、デフォルトの読み取り操作ではロックが生成されません。MySQLデータベースバージョン5.5.8以降、InnoDBストレージエンジンがデフォルトのストレージエンジンです。
- InnoDBストレージエンジンは、データを論理表スペース(.ibd)に配置します。このスペースは、ブラックボックスのようにInnoDBストレージエンジン自体によって管理されます。MySQL 4.1(4.1を含む)以降、各InnoDBストレージエンジンのテーブルを個別のibdファイルに個別に格納できます。さらに、InnoDBストレージエンジンは、rawデバイス(行ディスク)を使用してテーブルスペースを作成することをサポートしています。
- InnoDBは、高い並行性を取得を通じてマルチバージョン同時実行制御(MVCC)の使用、及び実装SQL標準の4つの分離レベルを、デフォルトが反復レベルです。同時に、ファントムの発生を回避するために、ネクストキーロックと呼ばれる戦略が使用されます。さらに、InnoDBストレージエンジンは、挿入バッファー、二重書き込み、適応ハッシュインデックス、先読みなどの高性能と高可用性も提供します。機能
- テーブルへのデータの保存では、InnoDBストレージエンジンはクラスター化されたメソッドを使用するため、各テーブルのストレージは主キーの順序で保存されます。主キーがテーブル定義で明示的に指定されていない場合、InnoDBストレージエンジンは行ごとに6バイトのROWIDを生成し、これを主キーとして使用します。
- InnoDBストレージエンジンは、MySQLデータベース、およびFacebook、Google、Yahoo!で最も一般的に使用されているエンジンです。他社の成功したアプリケーションは、InnoDBストレージエンジンの高可用性、高性能、および高スケーラビリティを証明しています
- InnoDBでサポートされているファイルは次のとおりです。
- .frm、参照: https: //blog.csdn.net/qq_41453285/article/details/104115799
- .ibd、参照: https: //blog.csdn.net/qq_41453285/article/details/104115914
3、MyISAMストレージエンジン
- MyISAMストレージエンジンは、トランザクションとテーブルロックの設計をサポートせず、フルテキストインデックスをサポートします。これは主に一部のOLAPデータベースアプリケーション用です。MySQL 5.5.8より前は、MyISAMストレージエンジンがデフォルトのストレージエンジンでした(Windowsバージョンを除く)。データベースシステムとファイルシステムの大きな違いの1つは、トランザクションのサポートです。ただし、MyISAMストレージエンジンはトランザクションをサポートしていません。根本的に、これを理解するのは難しくありません。ユーザーがすべてのアプリケーションでトランザクションを必要とするかどうか想像してみてください。データウェアハウスで、ETLなどの操作がない場合でも、単純なレポートクエリにはトランザクションサポートが必要ですか?さらに、MyISAMストレージエンジンのもう1つの違いは、そのバッファプールがデータファイルではなくインデックスファイルのみをキャッシュすることです。これは、ほとんどのデータベースとは大きく異なります。
-
MyIASMはトランザクションをサポートしておらず、「テーブルレベルのロックのみをサポートし、行レベルのロックはサポートしていません」には、やるべきことがたくさんあります。
- MyISAMストレージエンジンテーブルは、MYDとMYIで構成されています。MYDはデータファイルの保存に使用され、MYIはインデックスファイルの保存に使用されます。myisampackツールはハフマン(ハフマン)符号化静的アルゴリズムを使用してデータを圧縮するため、myisampackツールを使用してデータファイルをさらに圧縮できます。したがって、myisampackツールで圧縮されたテーブルは読み取り専用です。もちろん、ユーザーは読み取り専用にすることもできます。 myisampackファイルを介してデータを解凍します。
- MySQL 5.0より前のバージョンでは、MyISAMはデフォルトで4GBのテーブルサイズをサポートしていました。4GBを超えるMyISAMテーブルをサポートする必要がある場合は、MAX_ROWS属性とAVG_ROW_LENGTH属性を指定する必要があります。MySQL 5.0以降、MyISAMはデフォルトで256TBの単一テーブルデータをサポートします。これは、一般的なアプリケーション要件を満たすのに十分です。
- MyISAMでサポートされているファイルは次のとおりです。
- .frm、参照:https://blog.csdn.net/qq_41453285/article/details/104115799
- .MYD
- .MYI
注意
- MyISAMストレージエンジンテーブルの場合、MySQLデータベースはインデックスファイルのみをキャッシュし、データファイルはオペレーティングシステム自体によってキャッシュされます。これは、LRUアルゴリズムを使用してデータをキャッシュする他のほとんどのデータベースとは大きく異なります。さらに、MySQLバージョン5.1.23より前では、32ビットまたは64ビットのオペレーティングシステム環境で、キャッシュインデックスの最大バッファーは4GBにしか設定できませんでした。それ以降のバージョンでは、64ビットシステムは4GBを超えるインデックスバッファをサポートできます
4、NDBストレージエンジン
- 2003年、MySQLABはSonyEricssonからNDBクラスターエンジンを買収しました。NDBストレージエンジンは、OracleのRACクラスタに似たクラスタストレージエンジンですが、Oracle RACとは異なり、すべてを共有するアーキテクチャであり、その構造はシェアードナッシングクラスタアーキテクチャであるため、より高い可用性を提供できます。NDBの特徴は、すべてのデータがメモリに保存されることです( MySQL 5.1以降、インデックス付けされていないデータはディスクに保存できます)。そのため、主キーの検索速度が非常に速く、NDBを追加することでデータベースのパフォーマンスを直線的に向上させることができます。データストレージノード。これは、可用性とパフォーマンスの高いクラスターシステムです。
- NDBストレージエンジンに関しては、注目に値する問題があります。つまり、NDBストレージエンジンの接続操作(JOIN)は、ストレージエンジン層ではなく、MySQLデータベース層で完了します。これは、複雑な接続操作には膨大なネットワークオーバーヘッドが必要になるため、クエリ速度が非常に遅いことを意味します。この問題が解決されれば、NDBストレージエンジンの市場は非常に巨大になるはずです。
注意
- MySQL NDBクラスターストレージエンジンは、コミュニティバージョンとエンタープライズバージョンで利用でき、 NDBクラスターはCarrier Grade Editionの個別のダウンロードバージョンとして存在します。最新バージョンは、http://dev.mysql.com/から入手できます。downloads / cluster / index.htmlNDBクラスターストレージエンジン
5、メモリストレージエンジン
- メモリストレージエンジン(以前はHEAPストレージエンジンと呼ばれていました)は、テーブル内のデータをメモリに格納します。データベースが再起動またはクラッシュすると、テーブル内のデータは表示されなくなります。一時データを格納するための一時テーブルや、データウェアハウスの緯度テーブルに非常に適しています。おなじみのB +ツリーインデックスではなく、デフォルトのハッシュインデックスで使用されるメモリストレージエンジン。
- メモリストレージエンジンは非常に高速ですが、それでも使用には一定の制限があります。たとえば、テーブルロックのみがサポートされ、同時実行のパフォーマンスが低く、TEXTおよびBLOB列タイプはサポートされていません。最も重要なことは、可変長フィールド(varchar)の格納が定数フィールド(char)の方法で行われるため、メモリが無駄になることです(この問題については前に説明しましたが、eBayエンジニアのIgor Chernyshevはすでにパッチソリューションを提供しています) 。
- さらに、MySQLデータベースがメモリストレージエンジンを一時テーブルとして使用して、クエリの中間結果セット(中間結果)を格納していることを見逃しがちです。中間結果が設定されたメモリ容量設定テーブルストレージエンジン、またはTEXTまたはBLOB列タイプフィールドを含む中間結果よりも大きい場合、MySQLデータベースはのディスクに格納されているMyISAMストレージエンジンテーブルに変換されます。前述のように、MyISAMはデータファイルをキャッシュしないため、この時点で生成された一時テーブルのパフォーマンスはクエリによって失われます。
6、アーカイブストレージエンジン
- アーカイブストレージエンジンは唯一のINSERTおよびSELECT操作をサポートし、そしてインデックスは、MySQL 5.1以降でサポートされています。アーカイブストレージエンジンは、zlibアルゴリズムを使用してデータの行を圧縮して保存します。圧縮率は、通常、最大1:10です。その名前が示すように、アーカイブストレージエンジンは、ログ情報などのアーカイブデータの保存に非常に適しています。アーカイブストレージエンジンは、行ロックを使用して高度な同時挿入操作を実装しますが、それ自体はトランザクションセーフなストレージエンジンではありません。その設計目標は、高速の挿入および圧縮機能を提供することです。
セブン、フェデレーションストレージエンジン
- フェデレーションストレージエンジンテーブルはデータを格納せず、リモートMySQLデータベースサーバー上のテーブルを指すだけです。これは、SQL ServerのリンクサーバーとOracleの透過ゲートウェイに非常に似ています。違いは、現在のフェデレーションストレージエンジンがMySQLデータベーステーブルのみをサポートし、異種データベーステーブルをサポートしないことです。
エイト、マリアストレージエンジン
- Mariaストレージエンジンは新しく開発されたエンジンです。設計目標は、元のMyISAMストレージエンジンを置き換えて、 MySQLのデフォルトのストレージエンジンになることです。Mariaストレージエンジンの開発者は、MySQLの創設者の1人であるMichaelWideniusです。したがって、MyISAMのフォローアップバージョンと見なすことができます。Mariaストレージエンジンの特徴は、データとインデックスファイルのキャッシュのサポート、行ロック設計の適用、MVCC機能の提供、トランザクションと非トランザクションのセキュリティオプションのサポート、およびBLOB文字タイプの処理パフォーマンスの向上です。
9、他のストレージエンジン
- 上記の7つのストレージエンジンに加えて、MySQLデータベースには、Merge、CSV、Sphinx、Infobrightなど、他の多くのストレージエンジンがあります。これらはすべて独自の使用例があるため、ここでは1つずつ紹介しません。
- MySQLデータベースには非常に多くのストレージエンジンがあることを理解した後、次の疑問を解決できます。
- MySQLデータベースがフルテキストインデックスをサポートしないのはなぜですか?しない!MySQLは、MyISAM、InnoDB(バージョン1.2)、およびSphinxストレージエンジンをすべてサポートし、フルテキストインデックスをサポートします。
- MySQLはトランザクションをサポートしていないので高速ですか?違う!MySQLのMyISAMストレージエンジンはトランザクションをサポートしていませんが、InnoDBはサポートしています。「高速」はさまざまなアプリケーションに関連しています。ETL操作の場合、MyISAMには利点がありますが、OLTP環境では、InnoDBストレージエンジンの方が効率的です。
- テーブル内のデータ量が1,000万を超えると、MySQLのパフォーマンスは劇的に低下しますか?しない!MySQLはデータベースであり、ファイルではありません。データ行の数が増えると、パフォーマンスはもちろん低下しますが、これらの低下は直線的ではありません。ユーザーが正しいストレージエンジンと正しい構成を選択すると、MySQLのデータ量に関係なく、耐えることができます。公式マニュアルに記載されているように、Mytrix and Inc.は1TBを超えるデータをInnoDBに保存し、他の一部のWebサイトはInnoDBストレージエンジンを使用して、挿入/更新操作を1秒間に平均800回処理します。
10.ストレージエンジン間の比較
アイコン
- 次の図は、MySQLの公式マニュアルから抜粋したものです。比較内容には、ストレージコンテナの制限、トランザクションのサポート、ロックの粒度、MVCCのサポート、サポートされているインデックス、バックアップとレプリケーションなどが含まれます。
11.現在のデータベースでサポートされているストレージエンジンを表示する
- SHOW ENGINESステートメントを介してMySQLで現在使用されているストレージエンジンを表示するか、information_schemaでENGINESテーブルを検索できます。