応用例と制限事項
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2021/11/12 07:37 UTC 版)
「索引 (データベース)」の記事における「応用例と制限事項」の解説
インデックスは多くの応用例に役立つが、いくつかの制限事項がある。次のSQLステートメントについて考えてみよう。 SELECT first_name FROM people WHERE last_name = 'Smith'; インデックスなしでこのステートメントを処理するには、データベースソフトウェアは、テーブルのすべての行のlast_name列を確認する必要がある(全表スキャンと呼ばれる)。インデックスを使う場合、データベースは、項目にSmithが見つかるまで、インデックスデータ構造(通常はB木)に従って検索する。この方法は、全表スキャンよりもはるかに計算コストが低くなる。 次のSQLステートメントについて考えてみよう。 SELECT email_address FROM customers WHERE email_address LIKE '%@wikipedia.org'; このクエリにより、電子メールアドレスが「@wikipedia.org」で終わるすべての顧客の電子メールアドレスが返されるが、email_address列にインデックスが付けられている場合でも、データベースは完全なインデックススキャンを実行する必要がある。これは、単語が左から右に移動することを前提としてインデックスが作成されているからである。検索語の先頭にワイルドカードが付いていると、データベースソフトウェアはインデックスデータ構造を活用できない(つまり、WHERE句は検索引数可能 (SARGable)ではない)。この問題は reverse(email_address)を元に作成した別のインデックスと次のようなSQLクエリで解決できる。 SELECT email_address FROM customers WHERE reverse(email_address) LIKE reverse('%@wikipedia.org'); 。これにより、クエリの右端の部分(現在はgro.aidepikiw @%)にワイルドカードが配置され、reverse(email_address)のインデックスを活用できる。 検索ワードの両側で%wikipedia.org%のようにワイルドカード文字が使われている場合、このフィールドでインデックスは活用できない。計算時間がO(N)かかる順次検索が行われる。
※この「応用例と制限事項」の解説は、「索引 (データベース)」の解説の一部です。
「応用例と制限事項」を含む「索引 (データベース)」の記事については、「索引 (データベース)」の概要を参照ください。
- 応用例と制限事項のページへのリンク