はじめに
この実験(Lab)では、SQLite データベースを最適なパフォーマンスで維持する方法を学びます。VACUUM
コマンドを使用してスペースを再利用したり、インデックスを再構築してクエリを高速化したり、テーブル統計を分析して SQLite がより適切な判断を下せるようにするなど、重要なテクニックについて説明します。それでは始めましょう!
この実験(Lab)では、SQLite データベースを最適なパフォーマンスで維持する方法を学びます。VACUUM
コマンドを使用してスペースを再利用したり、インデックスを再構築してクエリを高速化したり、テーブル統計を分析して SQLite がより適切な判断を下せるようにするなど、重要なテクニックについて説明します。それでは始めましょう!
メンテナンスに入る前に、SQLite データベースといくつかのデータを含むサンプルテーブルを作成しましょう。これにより、作業対象ができます。
まず、LabEx VM でターミナルを開きます。デフォルトのパスは /home/labex/project
です。
mydb.db
という名前の SQLite データベースを作成するには、次のコマンドを実行します。
sqlite3 mydb.db
このコマンドは、データベースファイルが存在しない場合は作成し、SQLite コマンドラインツールを開いてデータベースに接続します。sqlite>
プロンプトが表示されます。
次に、ユーザー情報を格納する users
という名前のテーブルを作成しましょう。次の SQL コマンドを実行します。
CREATE TABLE users (id INTEGER PRIMARY KEY, name TEXT, email TEXT);
このコマンドは、id
(各ユーザーを一意に識別する整数)、name
(ユーザーの名前)、および email
(ユーザーのメールアドレス) の 3 つの列を持つテーブルを作成します。PRIMARY KEY
制約により、各 id
が一意であることが保証されます。
次に、いくつかのサンプルデータを users
テーブルに挿入しましょう。
INSERT INTO users (name, email) VALUES ('Alice', '[email protected]');
INSERT INTO users (name, email) VALUES ('Bob', '[email protected]');
INSERT INTO users (name, email) VALUES ('Charlie', '[email protected]');
これらのコマンドは、users
テーブルに 3 つの行を追加します。
テーブルとデータが正常に作成されたことを確認するには、次のコマンドを実行します。
SELECT * FROM users;
期待される出力:
1|Alice|[email protected]
2|Bob|[email protected]
3|Charlie|[email protected]
この出力は、users
テーブルの内容を示しています。
VACUUM
の効果を示すために、データの削除をシミュレートする必要があります。これにより、データベースファイルに断片化が発生する可能性があります。
users
テーブルから行を削除してみましょう。
DELETE FROM users WHERE id = 2;
このコマンドは、id
が 2 の行 (Bob のレコード) を削除します。
削除を確認するには、次のコマンドを実行します。
SELECT * FROM users;
期待される出力:
1|Alice|[email protected]
3|Charlie|[email protected]
Bob のレコードがテーブルに存在しなくなったことがわかります。この削除により、データベースファイルにギャップが生じます。VACUUM
は、このギャップに対処するのに役立ちます。
次に、VACUUM
コマンドを使用してデータベースファイルをデフラグ(defragment)し、削除されたレコードによって残されたスペースを再利用しましょう。
SQLite シェル内で次のコマンドを実行します。
VACUUM;
このコマンドは、データベースファイル全体を書き換え、データを統合し、空きスペースを削除します。
VACUUM
を実行しても、特定の出力は表示されませんが、データベースを最適化するためにバックグラウンドで動作しています。
SQLite シェルを終了するには、次を実行します。
.exit
これでターミナルに戻ります。
インデックスは、クエリの高速化に不可欠です。 users
テーブルの email
列にインデックスを作成してみましょう。
まず、SQLite データベースに再度接続します。
sqlite3 mydb.db
次に、次のコマンドを使用してインデックスを作成します。
CREATE INDEX idx_users_email ON users (email);
このコマンドは、email
列に idx_users_email
という名前のインデックスを作成します。SQLite は、このインデックスを使用して、メールアドレスに基づいてユーザーをすばやく検索します。
時間が経つにつれて、特に多くのデータ変更の後、インデックスは断片化(fragmentation)する可能性があります。インデックスを再構築すると、効率が向上します。
先ほど作成したインデックスを再構築するには、REINDEX
コマンドを使用します。
REINDEX idx_users_email;
このコマンドは、idx_users_email
インデックスを再構築し、現在のデータに合わせて最適化されていることを保証します。
SQLite シェルを終了するには、次を実行します。
.exit
これでターミナルに戻ります。
SQLite は、クエリを最適化するためにデータに関する統計情報を使用します。これらの統計情報を定期的に更新することをお勧めします。
まず、SQLite データベースに再度接続します。
sqlite3 mydb.db
users
テーブルを分析するには、次のコマンドを実行します。
ANALYZE users;
このコマンドは、users
テーブルに関する統計情報を収集します。クエリオプティマイザ(query optimizer)は、この情報を使用してクエリのパフォーマンスを向上させることができます。
最後に、SQLite シェルを終了します。
.exit
これでターミナルに戻ります。
この実験(Lab)では、SQLite データベースで不可欠なメンテナンス作業を実行する方法を学びました。 VACUUM
コマンドを使用してスペースを再利用し、クエリのパフォーマンスを向上させるためにインデックスを作成および再構築し、SQLite がクエリを最適化するのに役立つようにテーブル統計を分析しました。これらのテクニックは、データベースをスムーズかつ効率的に実行し続けるために非常に重要です。