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が高速になるという私の投稿の一部を次に示します
May 03, 2012
:どちらが速いか、InnoDBまたはMyISAM?Sep 20, 2011
:Best of MyISAM and InnoDB >May 10, 2011
:固定サイズのフィールドでCHARとVARCHARを使用すると、パフォーマンスにどのような影響がありますか?>
固定行テーブルのデメリット
ほとんどの場合、ALTER TABLE mytable ROW_FORMAT=Fixed;
を実行すると 、テーブルは80〜100%大きくなる可能性があります。 .MYI
ファイル(MyISAMテーブルのインデックスページ)も同じ速度で増加します。
エピローグ
MyISAMテーブルの速度が必要で、より大きなテーブルで動作できる場合は、別の提案が必要になります。 MyISAMテーブルごとにスペースを節約する場合は、行形式をそのままにします(動的)。 OPTIMIZE TABLE mytable;
を使用してテーブルを圧縮する必要があります 動的テーブルでより頻繁に。