この記事では、mysql に関する関連知識を提供します。主に、バイナリ コンテンツからの InnoDB 行フォーマットに関する関連問題を紹介します。InnoDB は、テーブル内のデータをディスクに保存するシステムです。ストレージ エンジンなので、データがシャットダウンして再起動してもまだ存在します。
推奨学習: mysql ビデオ チュートリアル
InnoDB はディスク上のテーブルにデータを保存するストレージ エンジンであるため、シャットダウンした後でもダウンして再起動しても、データはまだ存在します。データ処理の実際のプロセスはメモリ内で発生するため、ディスク内のデータをメモリにロードする必要があります。書き込みまたは変更要求を処理している場合は、メモリ内の内容もディスクに更新する必要があります。また、ディスクへの読み取りおよび書き込みの速度は非常に遅いことがわかっており、これはメモリ内での読み取りおよび書き込みとは数桁異なります。したがって、テーブルから特定のレコードを取得したい場合、InnoDB ストレージ エンジンは読み取りを行う必要がありますか?ディスクからレコードを 1 つずつ取り出しますか?
InnoDB で採用されている方法は、データを複数のページに分割し、ページをディスクとメモリ間の対話の基本単位として使用することです。InnoDB のページのサイズは通常 16KB です。つまり、通常の状況では、一度に少なくとも 16 KB のコンテンツがディスクからメモリに読み取られ、メモリ内の少なくとも 16 KB のコンテンツが一度にディスクにリフレッシュされます。
mysql> show variables like '%innodb_page_size%'; +------------------+-------+ | Variable_name | Value | +------------------+-------+ | innodb_page_size | 16384 | +------------------+-------+ 1 row in set (0.00 sec)
通常、データはレコード単位でテーブルに挿入されます。これらのレコードがディスク上に格納される方法は、行形式またはレコード形式とも呼ばれます。 InnoDB ストレージ エンジンは、コンパクト、冗長、動的、圧縮行フォーマットという 4 つの異なるタイプの行フォーマットを設計しました。
初期の InnoDB バージョンでは、ファイル形式が 1 つしかなかったため、このファイル形式に名前を付ける必要はありませんでした。 InnoDB エンジンが進化するにつれて、新機能をサポートするために、以前のバージョンと互換性のない新しいファイル形式が開発されています。アップグレードおよびダウングレードの状況でのシステム互換性の管理、および異なる MySQL バージョンの実行を支援するために、InnoDB は名前付きファイル形式の使用を開始しました。
msyql 5.7.9 以降のバージョンでは、デフォルトの行形式は innodb_default_row_format 変数によって決定され、そのデフォルト値は動的です:
mysql> show variables like "innodb_file_format"; +--------------------+-----------+ | Variable_name | Value | +--------------------+-----------+ | innodb_file_format | Barracuda | +--------------------+-----------+ 1 row in set (0.01 sec) mysql> show variables like "innodb_default_row_format"; +---------------------------+---------+ | Variable_name | Value | +---------------------------+---------+ | innodb_default_row_format | dynamic | +---------------------------+---------+ 1 row in set (0.00 sec)
View行形式を使用する現在のテーブル:
mysql> show table status like 'dept_emp'\G*************************** 1. row *************************** Name: dept_emp Engine: InnoDB Version: 10 Row_format: Dynamic Rows: 331570 Avg_row_length: 36 Data_length: 12075008Max_data_length: 0 Index_length: 5783552 Data_free: 0 Auto_increment: NULL Create_time: 2021-08-11 09:04:36 Update_time: NULL Check_time: NULL Collation: latin1_swedish_ci Checksum: NULL Create_options: Comment:1 row in set (0.00 sec)
テーブルの行形式を指定します:
CREATE TABLE 表名(列的信息) ROW_FORMAT=行格式名称ALTER TABLE 表名 ROW_FORMAT=行格式名称;
#行形式COMPACT既存のテーブルの行モードを圧縮または動的に変更する場合は、最初にファイル形式を Barracuda に設定する必要があります: set global innodb_file_format=Barracuda; 次に、ALTER TABLE tablename ROW_FORMAT=COMPRESSED; を使用して変更して有効にします。
テーブル内の一部の列には NULL 値が格納される場合があります。これらの NULL 値がレコードの実データに格納されると、多くのスペースを占有することになるため、Compact行形式では、これらの値を NULL 列として均一に管理し、NULL 値リストに格納します。 NULL を格納できる各カラムはバイナリ ビットに対応しており、バイナリ ビットの値が 1 の場合、そのカラムの値は NULL であることを意味します。バイナリ ビット値が 0 の場合、列の値が NULL ではないことを意味します。
レコードを説明するために使用されるレコード ヘッダー情報。固定の 5 バイトで構成されます。 5 バイトは 40 バイナリ ビットであり、異なるビットは異なる意味を表します。
長さ (ビット) | 説明 | |
---|---|---|
1 | 未使用 | |
1 | 未使用使用 | |
1 | レコードが削除されたかどうかをマークします | |
1 | B ツリーの各層の非リーフ ノードの最小レコードがこのマークで追加されます | ##n_owned |
カレントレコードが所有するレコード数を示します | heap_no | |
カレントレコードの位置情報を示しますページ上のレコード | record_type | |
は現在のレコードのタイプを表し、0 は通常のレコードを表し、1 は B ツリーを表します非リーフ ノード レコード。2 は最小レコードを表し、3 は最大レコードを表します。 | next_record | |
次のレコードの相対位置を示します。記録############ |
以上がMySQL のバイナリ コンテンツから InnoDB 行形式を読み取る方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。