sql >> データベース >  >> RDS >> Mysql

MySQLのテーブル定義の最後にVARCHAR列を配置する必要がありますか?

    MySQLはストレージをストレージエンジンに委任し、ストレージを非常に異なる方法で実装するため、「MySQL」についてその質問をすることは役に立ちません。個々のストレージエンジンについてこの質問をするのは理にかなっています。

    MEMORYエンジンには、可変長のデータ型は存在しません。 VARCHARはサイレントにCHARに変更されます。あなたの質問の文脈では:テーブル定義のどこにVARCHARを置くかは問題ではありません。

    MyISAMエンジンでは、テーブルに可変長データ(VARCHAR、VARBINARY、またはTEXTまたはBLOBタイプ)がまったくない場合、それはMyISAMのFIXEDバリアントです。つまり、レコードのバイト長は固定されています。これは、特にデータが繰り返し削除および挿入される場合(つまり、テーブルが追加されるだけではない場合)、パフォーマンスに影響を与える可能性があります。可変長データ型がテーブル定義の一部になるとすぐに、それはMyISAMのDYNAMICバリアントになり、MyISAMは内部的に最短のCHAR型を除くすべてをVARCHARに変更します。繰り返しになりますが、CHAR/VARCHARの位置や定義さえも重要ではありません。

    InnoDBエンジンでは、データは16KBサイズのページに保存されます。ページには、チェックサム付きのページフッターとページヘッダーがあり、特にページディレクトリがあります。ページディレクトリには、各行について、ページの先頭を基準にしたその行のオフセットが含まれています。ページには空き領域も含まれており、すべてのI/Oはページで行われます。

    したがって、InnoDBは、ページに空き領域がある限り、VARCHARを所定の位置に拡張し、追加のI / Oを発生させることなく、ページ内で行を移動できます。また、すべての行が(ページ番号、ページディレクトリエントリ)としてアドレス指定されているため、ページ内の行の移動はページにローカライズされ、外部からは見えません。

    また、InnoDBの場合も、行内の列の順序はまったく重要ではないことを意味します。

    これらは、MySQLで最も一般的に使用される3つのストレージエンジンであり、列の順序はこれら3つのいずれでも重要ではありません。これが当てはまらない、他のよりエキゾチックなストレージエンジンが存在する可能性があります。



    1. 警告:mysqli_connect():(HY000 / 1045):ユーザー'username' @'localhost'のアクセスが拒否されました(パスワードを使用:YES)

    2. SQLServerSMOがDLLの欠落について不平を言う

    3. SQLNonTransientConnectionExceptionEclipseでのMySQLとの接続

    4. MySQLで1日あたりの新規ユーザーを獲得する方法