InnoDBのテーブル構造


InnoDBはインデックス組織テーブルであり,この構造の格納はプライマリ・キーの順序に従って組織される.InnoDBでは、テーブルごとにプライマリ・キーが必要です.InnoDBがない場合は、自分でプライマリ・キーを特定または追加します.
InnoDBのプライマリ・キー・インデックスは集計インデックスとも呼ばれ、コアのインデックスであり、集計インデックスはB+ツリー構造を採用し、各インデックス・アイテムにはrowデータが含まれている.つまり、インデックスによって具体的なrowデータを定義することができ、二次IOを必要としない.
インデックス組織テーブルのプライマリ・キーの決定
プライマリ・キーはインデックス組織テーブルのコアであり、テーブル・データはプライマリ・キー順に格納され、InnoDBのプライマリ・キー決定プロセスは以下の通りである.
  • のほとんどのテーブルには、指定(すでに要求されている)が表示され、自己増加タイプとして指定されています.
  • 指定されていない場合、null以外のuniqueインデックスがあるかどうかを検索し、ある場合、columnはprimary keyである.
  • not null unique indexが複数見つかった場合、indexの定義順序がtableの定義順序ではない最初の順序が使用されます.
  • 一致しない場合、6バイトサイズのポインタがプライマリ・キーとして自動的に作成されます.rowId;

  • 構成
    InnoDBは、表領域、セグメント、領域、ページ、行に基づいてデータを整理します.1つの表領域には、データ・セグメント、インデックス・セグメントなどの異なるタイプのデータを格納する複数のセグメントが含まれます.各セグメントは複数の領域で構成され、各領域には複数のページがあり、ページはメモリプールの基本管理単位であり、インデックスの基本単位でもあり、各ページには複数の行が含まれ、行はデータとコアである.
  • 表空間:tablespaceはデータのトップクラスの組織と格納領域であり、各種情報、データ、インデックス、トランザクション情報などを格納している.
  • セグメント:segmentはデータセグメント、インデックスセグメント、ロールバックセグメントに分けることができ、データセグメントはB+ツリーのリーフノードであり、インデックスセグメントはB+ツリーの非リーフノードである.
  • 区:extent区の大きさは1 M固定する;
  • ページ:pageデフォルト16 KB、1ゾーン64 page、
  • 行:row InnoDBのデータはrowで格納され(hiveよりcolumnで格納され、両者の相違を招く)、1ページあたり最大79992行格納されます.

  • Varcharフィールドとcharフィールド
    InnoDBデータ行の格納フォーマットの特徴により、InnoDBでサポートされているVarcharは最大65535バイトであるが、他のメタ情報を格納する必要があるため、実際にはvarcharは最大65532バイトであり、65535はすべてのvarcharフィールドの合計であり、合計がこのサイズを超えるとtextまたはblobを使用する必要があり、一部のsqlレベルではinnoDBが自動的に変換される.
    また、1ページあたりのデータに2 rowデータが格納されないと、行オーバーフローが発生し、データオーバーフローがディスクIOを大きくするため、varcharフィールドの全長は8098を超えないようにします.
    varcharが長すぎると、InnoDBの作成時にtextまたはblobで置き換えられますが、text、blobはポインタのように格納され、ディスクIOも大きくなり、効率が低下します.
    charフィールドの単位は文字であり、表象的には固定長であるが、格納時も別のvarcharであり、varcharの単位はバイトであり、区別に注意しなければならない.すなわちchar(2)は異なる文字セットの下でabと「我々」は同じように格納される.
    拘束
    制約はデータベースの重要な特徴であり、InnoDBでは次のような制約がサポートされています.
  • タイプ制約:intタイプがstringを格納できないなど、適切なデータ型を使用します.
  • 一意の制約:primary keyまたはunique indexを定義します.
  • 外部キー制約:foregin keyを定義します.
  • enumおよびset制約;
  • トリガまたはdefalutを使用してデフォルト値を制約します.

  • 制約の作成方法:
  • private key;
  • unique key;
  • foregin key;
  • not null;
  • defalut;

  • SQL文
    create table xx (
        aa int defalut 1,
        bb varchar(800) not null,
        'sex' enum('1','0'),#     
        uniquey key(bb) , 
        primary key (aa)
    )engine = innodb;
    
    alert table xx add unique key idx_xx(aa);
    
    crete index idx_xx on xx (aa);
    
    create unique index idx_xx on xx (aa);
    
    #     trigger
    create trigger tr_aa {before|after insert|update|delete}
    on xx for each row BEGIN
    ....
    END

    PS :
    制約を作成すると同時に、基本的にはインデックスを作成することに等しいが、インデックスは物理的、性能的な最適化に偏っており、制約は論理的、ビジネス的な完全性である.
    *制約は必ずしもエラーを報告するものではありません.sql_を設定します.modeはstrict_trans_tables;*
    *テーブルごとに最大6つのトリガ*を作成します.
    MyISAMは外部キーとトランザクションをサポートしていません.
    パーティション
    InnoDBとMyISAM、NDBはパーティション化をサポートしていますが、一部のストレージエンジンではサポートされていません.パーティション化操作はプログラムパーティションによく見られ、データベースは水平パーティションのみをサポートし、垂直パーティションはサポートされません.
    垂直分割:columnに従って分割し、ホットスポットフィールドを分割します.
    mysqlはローカルパーティションのみをサポートします.つまり、データ、インデックスが一緒にあり、グローバルパーティションはサポートされません.グローバルパーティションは要求され、データは分離されますが、インデックスは分離されません.