Androidでデータベースを扱っているときに、sqlliteがどのように機能するかを正確に知りたいです。拡張子が .db のファイルにすべてを書き込むことを知っています。しかし、特定のテーブルをどのように読み書きするのでしょうか? ファイル全体をフェッチするのか、関連する部分だけをフェッチするのか、これらの操作をどのように正確に行うのか? 誰かが私にいくつかのリンクを提案してもらえますか? 私はグーグルを試しましたが、見つけたリンクはクエリの書き方を説明しているだけです。
2 に答える
そのためには、データベースの基礎を読む必要があります。すべての db フレームワークは、動作に関してはほぼ同じであるため、データベースの基本 (任意) について調査する必要があります。ここにいくつかの関連情報があります。
What does a database actually do to find out what matches a select statement?
率直に言って、それは力ずくの問題です。簡単に言えば、データベース内の各候補レコードを読み取り、式をフィールドに一致させます。したがって、「select * from table where name = 'fred'」がある場合、文字通り各レコードを実行し、「name」フィールドを取得して、それを「fred」と比較します。
ここで、「table.name」フィールドがインデックス化されている場合、データベースは最初にインデックスを使用して (可能性は高いですが、必ずしもそうとは限りません)、実際のフィルターを適用する候補レコードを見つけます。
これにより、式を適用する候補レコードの数が減ります。それ以外の場合は、「テーブル スキャン」と呼ばれるもの、つまりすべての行を読み取るだけです。
しかし、基本的に、候補レコードを見つける方法は、実際のフィルター式を適用する方法とは別のものであり、明らかに、実行できる巧妙な最適化がいくつかあります。
How does a database interpret a join differently to a query with several "where key1 = key2" statements?
さて、結合を使用して、フィルタが適用される新しい「疑似テーブル」を作成します。これで、フィルタ基準と結合基準ができました。結合条件を使用してこの「疑似テーブル」を作成し、それに対してフィルターを適用します。さて、結合を解釈するとき、それは再びフィルタと同じ問題です - 「疑似テーブル」のサブセットを構築するためのブルートフォース比較とインデックス読み取り。
How does the database store all its memory?
優れたデータベースの鍵の 1 つは、その I/O バッファーをどのように管理するかです。ただし、基本的にはRAMブロックをディスクブロックに一致させます。最新の仮想メモリ マネージャーを使用すると、より単純なデータベースは、そのメモリ バッファー マネージャーとして VM にほとんど依存することができます。ハイエンド DB は、これらすべてを自分たちで行います。
How are indexes stored?
B+Trees は通常、調べる必要があります。これは、何年も前からある簡単なテクニックです。その利点は、ほとんどのバランス ツリーと共有されます。ノードへの一貫したアクセスに加えて、すべてのリーフ ノードがリンクされているため、ノードからノードへキーの順序で簡単にトラバースできます。したがって、インデックスを使用すると、行はデータベース内の特定のフィールドに対して「並べ替えられた」と見なすことができ、データベースはその情報を活用して最適化に役立てることができます。これは、たとえば、インデックスにハッシュ テーブルを使用する場合とは異なります。ハッシュ テーブルでは、特定のレコードにすばやくアクセスすることしかできません。B ツリーでは、特定のレコードだけでなく、並べ替えられたリスト内のポイントにすばやく到達できます。
データベースに行を格納してインデックスを作成する実際のメカニズムは、非常に単純明快であり、よく理解されています。ゲームはバッファを管理し、SQL を効率的なクエリ パスに変換して、これらの基本的なストレージ イディオムを活用します。
次に、ストレージのイディオムに加えて、マルチユーザー、ロック、ロギング、およびトランザクションの複雑さが全体的に存在します。
Android での SQLite 操作は、他のプラットフォームでの SQLite 操作と何ら変わりはありません。
あなたの質問に対する非常に短い答え: SQLite ファイルは固定サイズのページに分割されます。各データベース オブジェクト (テーブル、インデックスなど) は、いくつかのページを占有します。オブジェクトを拡張する必要がある場合 (新しい行がテーブルに挿入されるなど)、空きページ リストから、またはデータベース ファイルのサイズを大きくすることによって、より多くの新しいページを割り当てることができます。行が削除されるか、オブジェクトが削除されると、再利用された空き領域が空きページ リストに入ります。どの操作でも、SQLite エンジンはファイル全体を取得しようとはしませんが、パフォーマンスを向上させるためにページ キャッシュを維持します。
一般的にはSQLite Web サイトで、特にSQLite データベース ファイル形式について、より詳細な説明を見つけることができます。