MySQLデータ行と行オーバーフローのメカニズムの詳細な説明

MySQLデータ行と行オーバーフローのメカニズムの詳細な説明

1. 行の形式は何ですか?

MySQL の行形式の設定は次のように表示されます。

実際、MySQL データ行には 2 つの形式があり、1 つは図に示す Compact 形式、もう 1 つは Redundant 形式です。

Compact はコンパクトな行形式であり、1 つのデータ ページにより多くのデータ行を格納するように設計されています。

考えてみてください。データ ページにさらに多くのデータ行を保存できるというのは、とても素晴らしいことです。MySQL は、データ ページでディスクからデータを読み取ります。データ ページにさらに多くの行を作成できれば、使用するスペースが少なくなり、全体的な効率が向上するのではないでしょうか。

公式サイト紹介: Compact は Redundant 形式と比較して 20% のストレージを節約できます。

Compact は MySQL 5.0 で導入されました。MySQL 5.1 以降では、行形式はデフォルトで 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 回数が少なくなるということですか?パフォーマンスは速くなりますか?

コンパクト形式の実装の考え方は、列の型が VARCHAR、VARBINARY、BLOB、または TEXT の場合、768 バイトを超える列のデータは他のデータ ページに配置されます。

以下のように表示されます。

物語の全体像は理解できましたか?

これにより、MySQL は、単一の varchar 列または text 列が大きすぎる状況、つまり単一のデータ ページに格納される行レコードが少なすぎる状況、IO が急増してメモリを占有する状況を効果的に防止します。

5. 行オーバーフローとは何ですか?

では、行オーバーフローとは何でしょうか?

デフォルトのデータページサイズが16KBの場合、バイトに変換すると16*1024 = 16384バイトになります。

1 ページに格納できる 16384 バイトは、1 行に格納できる最大 65535 バイトの数倍であることに気付きましたか?

つまり、保存したいデータ行が 65532 バイトより大きい場合は、書き込むことができません。保存するデータの単一行が 65535 バイト未満で 16384 バイトより大きい場合、挿入は正常に行えますが、挿入したデータを 1 つのデータ ページに保存することはできません。この時点で間違いなくオーバーフローが発生します!

実際、MySQL の設定では、サイズが 16384 バイトに達したときのみ行オーバーフローが発生しません。

varchar、text などのタイプの行の場合。このような列ストレージの長さが数百バイトに達すると、行オーバーフローが発生します。

6. 行がオーバーフローするのはなぜですか?

または、この写真を見てください:

MySQL の設定では、varchar 列の長さが 768 バイトに達すると、列の最初の 768 バイトがプレフィックスとして行に格納され、超過データはオーバーフロー ページに格納され、その後、オフセット ポインターを介して 2 つがリンクされます。これが行オーバーフローのメカニズムです。

7. 質問について考える

あなたはこの質問について考えたことがあるでしょうか:

まず、MySQL は B+Tree のクラスター化インデックスを使用することを知っておく必要があります。この B+Tree では、非リーフ ノードにはインデックスのみが格納され、データは格納されませんが、リーフ ノードには実際のデータが格納されます。同時に、リーフ ノードはデータ ページを指します。

では、1 行を保存できない場合は、2 つのデータ ページに保存してみてはいかがでしょうか。下の写真の通りです。

シングルノードストレージでは、本社の保存に複数のノードを使用します。たぶん私のB+Teeはもっと大きくて背が高くなるでしょう(これは実は間違った考えです)

このエラーの説明に対応する脳マップは次のとおりです。

MySQL がこれを行わない理由は次のとおりです。

MySQL が 1 つのデータ ページに複数のデータ行を保存する場合、少なくとも 2 行のデータを保存する必要があります。そうしないと、B+Tree の意味が失われます。 B+ツリーも非効率的なリンクリストに退化します。

この青い文の意味は理解できます。「各データ ページには少なくとも 2 行のデータが保存される必要がある」とは、データ ページには 1 行しか保存できないという意味ではありません。文字通り、1 行のデータを書き込むだけで、その後は食事に行ったり、他の何かをしたりできます。このデータ ページには、常に 1 行のデータのみが含まれます。

つまり、このデータ ページにデータ行を書き込むと、そのデータが非常に大きく、データ ページの制限に達した場合でも、行オーバーフロー メカニズムによってオーバーフローされます。これにより、次のデータがこのデータ ページに書き込まれることが保証されます。

正しいマインドマップは次のとおりです。

参照:

行フォーマット

列数制限

著者: Give Me Daydreams

出典: https://www.cnblogs.com/ZhuChangwu/p/14035330.html

上記は、MySQL データ行と行オーバーフローのメカニズムの詳細な説明です。MySQL データ行と行オーバーフローの詳細については、123WORDPRESS.COM の他の関連記事に注目してください。

以下もご興味があるかもしれません:
  • PHP mysql_fetch_row を使用してクエリを実行し、データ行のリストを取得する方法
  • データベース管理に役立つ 5 つの MySQL GUI ツール
  • MySQLデータベースを操作するためのコマンドラインツールmycliの簡単な紹介
  • 単一の MySQL テーブル内の行数が 500 万を超えてはいけないのはなぜですか?
  • PHP は、mysqli および pdo 拡張機能を使用して、mysql データベースの実行効率をテストおよび比較します。完全な例
  • MySQL は、元のデータと同じデータがある場合、更新ステートメントを再度実行しますか?
  • IDEAはプロパティ設定ファイルを使用してMySQLデータベースに接続します。
  • MySQL でデータ復旧に binlog を使用する方法
  • MySQLデータベースイベントスケジュール実行タスクの詳細な説明
  • Windows 10 での mysql5.5 データベース コマンドラインの中国語文字化け問題を解決する
  • JavaはMySQLデータベースに接続し、クエリを実行し、変更します

<<:  Springboot プロジェクトに動的にパラメータを渡すための Docker の実装方法

>>:  Vue の element-ui コンポーネントのデフォルトの CSS スタイルを変更する 4 つの方法

推薦する

Javascriptでビルダーパターンを実装する方法

概要ビルダー パターンは比較的単純なデザイン パターンであり、作成パターンに属します。定義: 複雑な...

HTML iframe と frameset の違い_PowerNode Java Academy

導入1.<iframe> タグ: iframe は、ページ内に内部フレームを生成するイン...

歴史的な Linux 画像処理および修復ソリューション

従来の Linux イメージで作成された ECS クラウド サーバーには、NTP と YUM が設定...

8桁の割引コードをランダムに生成し、MySQLデータベースに保存します。

現在、多くの企業が割引コードを通じてプロモーションを行っています。今では、8桁の割引コードを実装して...

Windows 10 と MySQL 5.5 のインストールとインストールなしの使用の詳細なチュートリアル (画像とテキスト)

この記事では、Windows 10環境でのMySQL 5.5のインストールと使用方法を紹介します。リ...

HTML入力ボックスの最適化により、ユーザーエクスペリエンスと使いやすさが向上します。

ユーザーエクスペリエンスと使いやすさを向上させるために、入力ボックスなど、Web ページでユーザーが...

CocosCreator で http と WebSocket を使用する方法

目次1. HTTPGET 2. HTTP POSTウェブソケット4. Egretのhttpとwebs...

Windows での MySQL コミュニティ サーバー 8.0.16 のインストールと構成方法のグラフィック チュートリアル

最近、MySQL関連の構文をよく見かけます。また、MySQLストアドプロシージャの書き方も学びたいの...

CSSは高さと幅を固定した要素の比例表示効果を実現します

padding-top パーセンテージを使用すると、固定幅と比例した高さの表示を実現できます。現在の...

Dockerはコンテナを通じてイメージを生成し、詳細にDockerCommitを送信します

目次ローカルでコンテナを作成した後、このコンテナに基づいてローカル イメージを作成し、このイメージを...

Docker実践: Pythonアプリケーションのコンテナ化

1. はじめにコンテナはサンドボックス メカニズムを使用して相互に分離します。コンテナ内にデプロイさ...

CSS3 でのシンプルな LED デジタル時計の実装方法

これは多くの人がやったことがあるはずです。ただうずうずして書きたかったので、時間をかけていじってダー...

CentOS に Memcached と PHP Memcached 拡張機能をインストールする

高性能分散メモリオブジェクトキャッシュシステムMemcachedについては、別の記事「Windows...

Docker デプロイメント RabbitMQ コンテナ実装プロセス分析

1. イメージをプルするまず、次のコマンドを実行して、イメージをローカル コンピューターにダウンロー...

初心者でもjsのtypeofとinstanceofの違いを理解できます

目次1. 型2. インスタンス3. 違い1. 型typeof 演算子は、評価されていないオペランドの...