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

Innodbのランダムプライマリキー

    MySQLは、挿入ごとにインデックスを「再構築」しません。

    MySQLのデフォルトのページサイズは16Kです。これらのページを1MB単位で割り当てます(エクステントと呼ばれます)。

    テーブルが最初に作成されたとき(インデックスが再構築されたとき)、ページは15/16いっぱいになり、ランダムに挿入する余地があります(1kの余地)。インデックスエントリがそれぞれ500バイト(主キーサイズ+クラスター化インデックスの行データ)の場合、ページを分割する前に2つの新しい行を挿入する余地があります。

    MySQLはページヘッダーに最高と最低のレコードの値を保持するため、特定の範囲内のレコードは同じページに移動します。

    MySQLがページ全体に行を挿入する必要がある場合は、ページを分割する必要があります。 MySQLは新しいページを追加し、ページデータの半分を新しいページに移動します。

    ページ内では、レコードは実際には物理的な順序ではない場合があります。挿入された順序になります。それらは、リンクリストの形式を介して順番にリンクされています。したがって、ページを分割する必要がない限り、ランダムに挿入しても、データが物理的に移動することはありません。

    多くのランダムな挿入の後、ページは1/2フルからフルになります。ハーフフルページが多いインデックスは、読み取りパフォーマンスに悪影響を及ぼします(1つの15/16フルページと同じ数のレコードを読み取るには、2つのハーフフルページを読み取る必要があります)。

    これで、行をインデックス順に挿入する場合、MySQLはページの最後に追加し続け、15/16をいっぱいにして、ページごとにエクステントを追加します。ページの分割がないため、パフォーマンスの低下がはるかに少なくなります。したがって、ほぼ完全なページの読み取りパフォーマンスの利点は言うまでもなく、データの移動も必要ありません。

    ランダム挿入はページの断片化も増加させます。これは、多数の連続したレコードを頻繁に読み取る場合(まれに)、読み取りパフォーマンスに影響を与える可能性があります。

    また、バッファリングの変更 影響を受ける可能性があります。




    1. PHPを使用してMySQLデータベース内のすべてのテーブルを表示しますか?

    2. Android RoomEmbeddedRelationはSQLwhere条件を無視します

    3. sqlcmdを使用してSQLServerからCSV形式でデータをエクスポートするにはどうすればよいですか?

    4. MySQLレプリケーションとGTIDベースのフェイルオーバー-誤ったトランザクションの詳細