Android --- SQLite の最適化

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 句を複数テーブル結合に置き換えます。

トランザクションを使用する

おすすめ

転載: blog.csdn.net/qq_44950283/article/details/131191587