web-dev-qa-db-ja.com

SQLiteのインメモリデータベースの利点

今日、SQLiteの本からキーワード ":memory:"について読みましたが、それはそれが何であるか、どのように使用するか、そして説明が短すぎただけです。そこで、ここで詳細情報を検索しましたが、SQLite固有の情報を取得できませんでした。

  1. 「:memory:」モードにはどのような利点がありますか? (これはいつ必要ですか?)

  2. インメモリデータベースのパフォーマンスは高速ですか?

  3. インメモリデータベースでトランザクションを使用する必要はありますか?

12
Jenix

A SQLiteインメモリデータベース の主な利点はパフォーマンスです。ディスクへの読み書きではなく、データベース全体をメモリに保持します。メモリはディスクよりもはるかに高速です。回転するディスクまたは負荷の高いIOロードされたサーバーで最大のパフォーマンスの向上が見られます。SSDではそれよりも少なくなります。

ただし、これは不適切に記述されたクエリとテーブルの万能薬ではありません。インメモリデータベースを使用してパフォーマンスを向上させる前に、テーブルのデザイン、クエリ、インデックスを最適化してください。

主な短所は、プロセスがデータベースを閉じた後でなくなることです。また、データベースは使用可能なメモリよりも大きくすることはできません。

ディスクに書き込む必要がないため、コミットは高速になる可能性があります。そのため、自動コミットモードは高速になる可能性がありますが、トランザクションはデータ整合性の目的で使用する必要があります。

大きくなりすぎない一時的なSQLiteデータベースは、おそらくメモリに格納されることに注意してください。

その欠点と、ストレージよりもメモリがはるかに少ないため、インメモリデータベースにコミットする前に一時データベースを試してください。これは、データベースファイル名に''を使用して行われます。これは一時ファイルに書き込みますが、作業をメモリキャッシュにバッファします。これは両方の長所であり、メモリを使いすぎずにパフォーマンスが向上します。

ディスクファイルは各一時データベースに割り当てられますが、実際には一時データベースは通常メモリ内のページャーキャッシュに存在するため、「:memory:」によって作成された純粋なメモリ内データベースと一時データベースの違いはほとんどありません。空のファイル名で作成されました。唯一の違いは、「:memory:」データベースは常にメモリ内に残しておく必要があることです。一方、データベースが大きくなったり、SQLiteがメモリ不足になったりすると、一時データベースの一部がディスクにフラッシュされる可能性があります。

アプリケーションをプロファイリングおよびベンチマークして、パフォーマンスが向上することを確認し、代わりにクエリを最適化してインデックスを追加する方が良いかどうかを検討し、データが消えても問題がないことを確認します。

28
Schwern