sql >> データベース >  >> RDS >> SQLite

SQLite式ベースのインデックス

    概要 :このチュートリアルでは、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に表示される式に関するすべての制限を示します。 ステートメント。

    1. 式は、インデックスが作成されているテーブルの列のみを参照する必要があります。他のテーブルの列を参照することはできません。
    2. 式は決定論的関数呼び出しのみを使用できます。
    3. 式はサブクエリを使用できません。

    このチュートリアルでは、SQLite式ベースのインデックスを使用してクエリのパフォーマンスを向上させる方法を学びました。


    1. SQLServerインスタンスでサポートされているデータベース照合を見つける方法

    2. PythonでOracle関数を呼び出す方法は?

    3. 異なる日付形式でCSVをMySQLにインポートする

    4. MySQLリモートアクセス用のSSHトンネルを作成する