概要 :このチュートリアルでは、SQLite式ベースのインデックスを使用してデータをクエリし、特に式または関数を使用するクエリのクエリパフォーマンスを向上させる方法を学習します。
SQLite式ベースのインデックスの概要
インデックスを作成するときは、多くの場合、テーブルで1つ以上の列を使用します。通常のインデックスに加えて、SQLiteではテーブル列に関連する式に基づいてインデックスを作成できます。この種のインデックスは、式ベースのインデックスと呼ばれます。
次のクエリは、会社の長さが10文字を超える顧客を選択します。
SELECT customerid,
company
FROM customers
WHERE length(company) > 10
ORDER BY length(company) DESC;
Code language: SQL (Structured Query Language) (sql)
EXPLAIN QUERY PLAN
を使用する場合 ステートメントでは、SQLiteクエリプランナーが顧客
全体をスキャンする必要があることがわかります 結果セットを返すテーブル。
EXPLAIN QUERY PLAN
SELECT customerid,
company
FROM customers
WHERE length(company) > 10
ORDER BY length(company) DESC;
Code language: SQL (Structured Query Language) (sql)
SQLiteクエリプランナーは、SQLステートメントを実行するための最適なアルゴリズムまたはクエリプランを決定するソフトウェアコンポーネントです。 SQLiteバージョン3.8.0以降、クエリプランナーコンポーネントは、より高速に実行され、より優れたクエリプランを生成するように書き直されました。書き直しは、次世代クエリプランナーまたはNGQPとして知られています。
式LENGTH(company)
に基づいてインデックスを作成するには 、次のステートメントを使用します。
CREATE INDEX customers_length_company
ON customers(LENGTH(company));
Code language: SQL (Structured Query Language) (sql)
上記のクエリを再度実行すると、SQLiteは式インデックスを使用してデータを検索し、より高速になります。
SQLite式ベースのインデックスのしくみ
SQLiteクエリプランナーは、 CREATE INDEX
で指定した式の場合にのみ式ベースのインデックスを使用します ステートメントは、WHERE句またはORDERBY句と同じように表示されます。
たとえば、サンプルデータベースには、 invoice_items
があります。 テーブル。
次のステートメントは、単価と数量の列を使用してインデックスを作成します。
CREATE INDEX invoice_line_amount
ON invoice_items(unitprice*quantity);
Code language: SQL (Structured Query Language) (sql)
ただし、次のクエリを実行する場合:
EXPLAIN QUERY PLAN
SELECT invoicelineid,
invoiceid,
unitprice*quantity
FROM invoice_items
WHERE quantity*unitprice > 10;
Code language: SQL (Structured Query Language) (sql)
CREATE INDEX
の式が原因で、SQLiteクエリプランナーはインデックスを使用しませんでした (単価*数量コード> )は
WHERE
のものと同じではありません 条項(数量*単価)
SQLite式ベースのインデックス制限
以下に、 CREATE INDEX
に表示される式に関するすべての制限を示します。 ステートメント。
- 式は、インデックスが作成されているテーブルの列のみを参照する必要があります。他のテーブルの列を参照することはできません。
- 式は決定論的関数呼び出しのみを使用できます。
- 式はサブクエリを使用できません。
このチュートリアルでは、SQLite式ベースのインデックスを使用してクエリのパフォーマンスを向上させる方法を学びました。