MyISAM がレコードを物理的に保存する方法と、レコードの挿入と削除後に構造を維持する方法を理解しようとしています。次のリンクを読みました。
正しく理解しているかどうかを確認したいので、正しくない場合は修正してください。
固定サイズのレコード
- 削除マーカーは、レコードが削除されるかどうかを決定します。
- レコード ヘッダーは、行のどの列に NULL 値が含まれているかを保持します
- データの長さは固定です。
可変長レコード
- 削除マーカーは BLOCK_DELETED ブロック タイプに置き換えられます
- レコード ヘッダーには、データの長さと未使用データの長さが保持されます
- 1 つのレコードを、オーバーフロー ポインタで接続された複数のブロックに分割できます。
消す
- 可変サイズのレコードの場合、ブロック タイプを BLOCK_DELETED に変更します
- 新しく削除されたレコードの前のポインタが最後に削除されたレコードを指すようにすることで、削除されたすべてのレコードの二重リンク リストを維持します。次に、最後に削除されたレコードの次のポインターは、新しく削除されたレコードを指します。
- 固定サイズのレコードの場合は、削除マーカーを削除済みに変更するだけです。(二重リンクリストを使用して、削除されたすべてのレコードを固定サイズのレコードに接続するかどうかは不明です)
挿入
- 未使用スペース(削除されたレコード)がない場合は、ファイルの最後にデータを追加します
- 新しく挿入されたレコードに適合する未使用スペースがある場合は、そこに新しいレコードを書き込みます。
- 新しく挿入されたレコードよりもはるかに大きな未使用スペースがある場合は、新しいレコードと削除されたレコードの 2 つのレコードに分割します。
- 新しく挿入されたレコードよりも小さい未使用スペースがある場合は、そこにデータを書き込み、オーバーフロー ポインターを別のブロックの未適合データを指すようにします。
更新中
- ユーザーが既存のデータをより長いデータで更新するとどうなりますか? MyISAM はレコードを削除済みとしてマークし、新しいデータに適合する場所を見つけますか、それとも単にオーバーフロー ポインターを使用して適合しないデータを指すのでしょうか?
もう一度質問を要約する
正しく理解しているかどうかを確認したいので、正しくない場合は修正してください。
追加の質問
- レコード構造がオーバーフロー ポインターと未使用の領域でいっぱいになる可能性があるため、テーブルが何度も削除および挿入された場合、非常に非効率的でしょうか?