SQLite は、ACID 準拠のリレーショナル データベース管理システムである軽量データベースであり、比較的小さな C ライブラリに含まれています。これは、D.RichardHipp によって設立されたパブリック ドメイン プロジェクトです。組み込み用に設計されており、多くの組み込み製品で使用されています。占有リソースは非常に少なく、組み込みデバイスでは数百 K のメモリだけで十分な場合があります。Windows/Linux/Unix などの主流のオペレーティング システムをサポートし、Java、C#、PHP、Tcl などの多くのプログラミング言語と組み合わせることができ、ODBC インターフェイスを備えています。オープンソースの世界 有名なデータベース管理システムに関する限り、その処理速度はそれらよりも高速です。SQLite の最初のアルファ バージョンは 2000 年 5 月に誕生し、2016 年から 16 年が経過しました。SQLite には新しいバージョン SQLite3 もリリースされています。
SQLiteデータ型
SQLite データベースに格納されるすべての値には、次のいずれかのストレージ タイプがあります。
ストレージタイプ | 説明 |
ヌル | 値は NULL 値です。 |
整数 | 値は、値のサイズに応じて 1、2、3、4、6、または 8 バイトに格納される符号付き整数です。 |
本物 | 値は、8 バイトの IEEE 浮動小数点数として格納された浮動小数点値です |
文章 | 値はテキスト文字列であり、データベース エンコーディング (UTF-8、UTF-16BE、または UTF-16LE) を使用して保存されます。 |
BLOB | 値は、入力に従って flex が保存するデータの塊です |
基本的な SQL 構文
DDL データ定義言語
注文 | 説明 |
作成 | 新しいテーブル、テーブルのビュー、またはデータベース内の他のオブジェクトを作成します。 |
変更 | データベース内の既存のデータベース オブジェクト (テーブルなど) を変更します。 |
落とす | テーブル全体、テーブルのビュー、またはデータベース内の他のオブジェクトを削除します。 |
DML データベース操作言語
注文 | 説明 |
入れる | テーブルにレコードを挿入する |
アップデート | 変更記録 |
消去 | レコードの削除 |
DQL データクエリ言語
注文 | 説明 |
選択する | 1 つ以上のテーブルから特定のレコードを取得する |
SQLite の最適化 (インタビュー)
索引
簡単に言えば、インデックスはテーブル内のデータへのポインタです。データベースの索引は、書籍の索引と非常によく似ています。中国語辞書のカタログページ(索引)を例にとると、ピンイン、画数、部首などで分類されたカタログ(索引)から目的の単語をすぐに見つけることができます。
利点: 単一テーブル クエリ、リンク テーブル クエリ、グループ クエリ、並べ替えクエリなどのデータベース検索が大幅に高速化されます。多くの場合、パフォーマンスは 1 ~ 2 桁向上し、データの増加に応じて桁違いに向上します。
欠点: インデックスの作成と保守には物理スペースが消費され、データ量の増加に伴って物理スペースも増加します。データベースを追加、削除、変更する場合はインデックスを維持する必要があり、追加、削除、変更のパフォーマンスに影響します。
インデックスの分類
インデックスを直接作成する: SQL ステートメントを使用して作成します。Android では、SQLiteOpenHelper の onCreate または onUpgrade で excuSql create ステートメントを直接作成できます。
create index id_index on user(id)
一意のインデックス: インデックス列内のすべてのデータが一意であり、クラスター化インデックスと非クラスター化インデックスの両方に使用できることを確認します。
create unique index id_index on user(id);
単一インデックス:上記の通常のインデックスと一意のインデックス作成例など、 インデックス作成ステートメントには1 つのフィールドのみが含まれます。
複合インデックス: 複合インデックスとも呼ばれ、インデックス作成ステートメントに同時に複数のフィールドが含まれます。
create index cx_index on user(id, name);
使用するシーン
特定のフィールドのデータ更新頻度が低く、クエリ頻度が高く、範囲クエリ(>、<、=、>=、<=)やorder by、group byが頻繁に発生する場合には、インデックスを使用することをお勧めします。ここで、選択性とは、フィールド内の一意の値の数/総数を指します。
複数の列が同時にアクセスされることが多く、各列に繰り返し値が含まれるため、複合インデックスの構築を検討してください。
インデックスの使用規則
複合インデックスの場合、最も頻繁に使用される列が先頭列 (インデックスの最初のフィールド) として使用されます。クエリ時に先頭の列がクエリ条件にない場合、複合インデックスは使用されません。
create index complex_index on user(id, name);
select * from user where id > 3; --使用了索引
select * from user where name like 'z*'; --未使用索引
--检验是否使用了索引
sqlite> explain query plan select * from user where id > 3;
QUERY PLAN
--SEARCH TABLE user USING INDEX sqlite_autoindex_user_1 (id>?)
Run Time: real 0.000 user 0.000000 sys 0.000000
sqlite> explain query plan select * from user where name like 'z*'
QUERY PLAN
--SCAN TABLE user
Run Time: real 0.001 user 0.000000 sys 0.000000
インデックス列の計算を避けてください。where 句列の計算がコンパイルおよび最適化できない場合、クエリ時にインデックスが失敗する原因となります。
select * from user where cast(id as char) = '3';
--检验
explain query plan select * from user where cast(id as char) = '3';
QUERY PLAN
--SCAN TABLE user
Run Time: real 0.001 user 0.000000 sys 0.000000
NULLを避けるために値を比較する
複数のテーブルをクエリする場合は、適切なテーブルを内部テーブルとして選択することに注意してください。接続条件は、インデックスのあるテーブルや行数の多いテーブルを十分に考慮する必要があり、内部テーブルと外部テーブルの選択は、外部テーブルの一致する行数 * の各検索回数の式で決定できます。内部テーブル、最小の積が最適なソリューションになります。実際のマルチテーブル操作が実際に実行される前に、クエリ オプティマイザーは、接続条件に従って可能な接続スキームのいくつかのグループをリストし、システム オーバーヘッドが最小の最適なスキームを見つけます。
クエリ列はインデックス列と同じ順序です
EXISTS 句を複数テーブル結合に置き換えます。
トランザクションを使用する