関連する無料学習の推奨事項:
1. 行の形式は何ですか?
次のようにして、MySQL の行形式設定を確認できます。 実際、MySQL データ行には 2 つの形式があり、1 つは図のコンパクト形式、もう 1 つは冗長形式です。 Compact はコンパクトな行形式であり、より多くのデータ行を 1 つのデータ ページに格納できるように設計されています。 おわかりでしょう。1 つのデータ ページに、より多くのデータ行を保存できるのは、とても興味深いことです。MySQL は、データ ページ単位でディスクからデータを読み取ります。1 つのデータ ページを許可できるかどうか行数が多ければ、使用するスペースが減り、全体の効率が上がるのではないでしょうか? 公式サイト紹介: コンパクトは冗長形式よりもストレージを 20% 節約できます。 Compact は MySQL5.0 から導入されました。MySQL5.1 以降、行フォーマットはデフォルトで Compact に設定されます。したがって、この記事で説明するものも Compact 形式です。2. コンパクト ライン形式はどのようなものですか?
テーブル内の一部の列は null が許可されており、一部の列は可変長の varchar 型であることを知っておく必要があります。 コンパクト行形式では、この情報をどのように整理して説明しますか?以下に示すように:各部分には、上でマークした 1、2、および 3 よりも多くのデータが含まれる場合があります。 より直観的に感じて理解をしていただくために、一部を抜粋してご紹介しました。
3. MySQL の 1 行にはどれくらいのデータを保存できますか?
MySQL 設定では、1 行のデータに最大 65535 バイトのデータを保存できます (文字ではなくバイトであることに注意してください) ただし、データ テーブルを作成する場合次のようなエラーが発生しました: MySQL では、65535 バイトの長さの列の作成は許可されていません。データ ページの各行には非表示の列があるためです。上記の通り。 したがって、テーブルを正常に作成するには、varchar の長さを 65532 バイトに減らします。 ここでの 65535 は、文字ではなくバイトを指すことに注意してください。 したがって、文字セットを utf8 エンコード形式に変更すると、varchar(N) の N は実際には N バイトではなく N 文字を参照します。したがって、以下のようなテーブルを作成するとエラーが発生します。#encode=utf8 の場合、3 バイトが 1 文字を表します。したがって、65535 / 3 = 21845 文字になります。
4. コンパクト形式はどのようにしてコンパクトになるのでしょうか?
MySQL は毎回ランダム IO 読み取りを実行します
デフォルトでは、データ ページのサイズは 16 KB です。データ ページにはいくつかの行が保存されています。
つまり、データ ページに保存できるデータ行が増えるほど、MySQL 全体で実行される IO 回数が少なくなるということですか?パフォーマンスは速くなりますか?
Compact 形式の実装の考え方は次のとおりです。列の型が VARCHAR、VARBINARY、BLOB、または TEXT の場合、768 バイトを超える列のデータは他のデータ ページに配置されます。
以下に示すように:
ストーリー全体がはっきりと見えますか?
MySQL は、単一の varchar カラムまたは Text カラムが大きすぎて、単一のデータ ページに格納される行レコードが少なすぎて IO が急増してメモリを占有することを効果的に防ぐためにこれを行います。
5. 行オーバーフローとは何ですか?それでは、行オーバーフローとは何でしょうか?
データ ページのデフォルト サイズが 16KB の場合、バイトに変換すると、16*1024 = 16384 バイト
データ ページに保存できる 16384 バイトには違いがあることに気づきましたか?単一ページ、単一行に保存できる最大 65535 バイトは何回ですか?
つまり、保存したいデータ行が65532byteを超えると書き込みができなくなります。保存する 1 行のデータが 65535 バイト未満で 16384 バイトを超える場合、挿入は正常に実行できますが、挿入したデータをデータ ページに保存できません。この時はラインが溢れてしまうこと間違いなし!
実際、MySQL の設定では、16384 バイトの境界に達するまで行オーバーフローは発生しません。
varchar、text、その他の型の行の場合。行オーバーフローは、このような列ストレージの長さが数百バイトに達すると発生します。
6. 行をオーバーフローするにはどうすればよいですか? まだこの図を見てください: MySQL 設定では、varchar カラムの長さが 768 バイトに達すると、カラムの最初の 768 バイトが処理されます。プレフィックスとして 行に格納されると、余分なデータがオーバーフローしてオーバーフロー ページに格納され、オフセット ポインターを介して 2 つが関連付けられます。これが行オーバーフロー メカニズムです。 7. 質問について考えてください あなたがそのような質問について考えたことがあるかどうかはわかりません: まず、あなたはMySQL は B ツリーのクラスタード インデックスを使用することを知っておく必要があります。この B ツリーでは、非リーフ ノードはインデックスのみを保存しデータは保存せず、リーフ ノードは実際のデータを保存します。同時に、リーフ ノードはデータ ページを指します。 では、単一行を保存できない場合は、2 つのデータ ページに保存してはどうでしょうか?下の写真のように~。 単一ノードのストレージ。本社を格納するために複数のノードを使用します。もしかしたら、私の B Tee はこのようにして大きく、高く成長できるかもしれません (これは実際には間違った考えです) この間違った説明に対応する脳マップは次のとおりです: MySQL がこれを行わない理由は次のとおりです: MySQL がデータ ページにさらに多くのデータ行を保存したい場合は、少なくとも 2 行のデータを保存する必要があります。そうでないとB Treeの意味がなくなってしまいます。 B ツリーも非効率なリンク リストに退化します。 この青い文を味わうことができます。彼が各データ ページに少なくとも 2 行のデータを保存する必要があると言っているのは、データ ページに 1 行しか保存できないという意味ではありません。実際には、データを 1 行書き込むだけで、その後、食事をしたり、別のことをしたりすることができます。このデータ ページには常に 1 行のデータのみが存在します。 この文が意味するのは、このデータ ページにデータ行を書き込むと、それが非常に大きい場合でも、行オーバーフロー メカニズムによってデータ ページの制限に達するということです。次のデータがこのデータ ページに書き込まれることが保証されています。 正しい脳マップは次のとおりです:
以上がMySQL のデータ行と行オーバーフロー メカニズムについての理解の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。