1

私がグーグルで調べたところ、sqlite はクラスター化されたインデックスをサポートしていません( Four: Clustered Indexesを参照)。

これは、インデックスが順次 INTEGER である場合、レコードはその INTEGER の順序でデータベースに物理的に配置されることを意味します。1、2、3 の順です。

  1. シーケンシャル int インデックスを含むテーブルからいくつかのレコードが削除された場合、新しい挿入のレコードはどこに配置されますか? 私が知っていることから、レコードの int ID は大きくなるだけなので、レコードは末尾に追加されますよね? 削除された場所が無駄になるということですか?
  2. シーケンシャル INTEGER インデックスがない場合、sqlite テーブルはヒープ テーブルですか? つまり、空き領域が最初に見つかった場所にレコードが配置されます。
4

1 に答える 1

0

1) そうです、レコードはテールに発生します。はい、データベース エンジンが簡単に再利用できない場合、削除された場所は無駄になる可能性があります。コマンドVACUUMを使用してデータベースを圧縮すると、未使用の場所が削除されます。

2) はい、そのような SQL テーブルはヒープ テーブルです。しかし、(あらゆる種類の) インデックスは、あたかもレコードが並べ替えられているかのように、データにアクセスするために正確に作成されます。インデックスは、レコードにリンクされた並べ替えられた値です。ただし、空き領域が最初に見つかった場所に新しいレコードが配置されるとは限りません。それらは、未使用のスペースとバイナリ データを書き込む時間を考慮して、データベース エンジンが適切に満たす場所に配置されます (キューでの発生は、途中での挿入よりも高速です)。

于 2011-03-29T07:42:49.123 に答える