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

MyISAMレコード構造を理解する

    MyISAMに関する質問であなたが持っている情報は、的を射ているものです。ただし、さらに2つの質問に答えたいと思います。

    最新の質問

    によると

    第10章:「ストレージエンジン」196ページパラグラフ7は言う

    その段落に基づいて、挿入する新しいデータが以前に割り当てられたブロックに収まらない場合にのみ、古いレコードがリンケージデータで上書きされます。これにより、多くの行が肥大化する可能性があります。

    追加の質問

    私の以前の回答から、持っているブロックがたくさんあるでしょう

    • スペースのブロック
    • レコードの長さ
    • ブロック内の未使用バイト数
    • NULL値インジケーターフラグ
    • レコードが以前に作成されたスペースに収まらず、分割する必要がある場合は、レコードの継続へのポインタである可能性があります

    このようなレコードリンクは、特大のデータが挿入されているすべての行の前から始まります。これにより、MyISAMテーブルの.MYDが肥大化する可能性があります 非常に迅速にファイルします。

    提案

    MyISAMのデフォルトの行形式は動的です。テーブルが動的で、多くのINSERT、UPDATE、およびDELETEが発生する場合、そのようなテーブルは

    で最適化する必要があります。
    OPTIMIZE TABLE mytable;
    

    別の方法があります。テーブルの行形式を固定に切り替えます。そうすれば、すべての行が同じサイズになります。これは、行形式を修正する方法です:

    ALTER TABLE mytable ROW_FORMAT=Fixed;
    

    固定行形式でも、使用可能なレコードを見つけるのに時間がかかる必要がありますが、時間はO(1)検索時間になります(素人の用語では、行数に関係なく、使用可能なレコードを見つけるのに同じ時間がかかりますテーブルにある、または削除された行の数)。 concurrent_insert 次のように:

    これをmy.cnfに追加します

    [mysqld]
    concurrent_insert = 2
    

    MySQLの再起動は必要ありません。実行するだけです

    mysql> SET GLOBAL concurrent_insert = 2;
    

    これにより、すべてのINSERTが空き領域を探すことなくテーブルの後ろに移動します。

    固定行テーブルの利点

    • 挿入、更新、および削除は多少高速になります
    • SELECTは20〜25%高速です

    行形式が修正されるとSELECTが高速になるという私の投稿の一部を次に示します

    固定行テーブルのデメリット

    ほとんどの場合、ALTER TABLE mytable ROW_FORMAT=Fixed;を実行すると 、テーブルは80〜100%大きくなる可能性があります。 .MYI ファイル(MyISAMテーブルのインデックスページ)も同じ速度で増加します。

    エピローグ

    MyISAMテーブルの速度が必要で、より大きなテーブルで動作できる場合は、別の提案が必要になります。 MyISAMテーブルごとにスペースを節約する場合は、行形式をそのままにします(動的)。 OPTIMIZE TABLE mytable;を使用してテーブルを圧縮する必要があります 動的テーブルでより頻繁に。




    1. ユーザーがPHPを使用してMySQLにすでに存在するかどうかを確認する方法

    2. MSSQLServerでのデータベーススキーマ変更の自動データ収集

    3. PL / SQLにはJavaと同等のStringTokenizerがありますか?

    4. mysqlコミュニティサーバーとmysqlインストーラー