MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLのLIKE検索は先頭ワイルドカード(%)で遅くなる?インデックスが使える書き方を実例で解説

結論から言うと、先頭にワイルドカード(% や _)を付けたLIKE検索では、MySQLは検索パフォーマンスを向上させることができません。その理由は、先頭がワイルドカードになっていると、MySQLがインデックスを利用できなくなるためです。

一方、後方にワイルドカードを配置した「anyLetter%」のような形式であれば、MySQLはインデックスを活用できるため、高速な検索が可能になります。

推奨される構文:後方ワイルドカードを使う

パフォーマンスを意識するなら、次のように末尾側にワイルドカードを置く構文を採用しましょう。

SELECT *FROM yourTableName WHERE yoorColumnName LIKE 'anyLetter%';

なぜ先頭ワイルドカードだとインデックスが使えないのか?

Bツリーインデックスは、文字列の先頭から順にソートされた構造を持っています。そのため、「J%」のように先頭の文字が確定している条件であれば、インデックスをたどって該当範囲だけを効率的に読み取れます。しかし、「%John」のように先頭が不明な場合は、どこを探せばよいのか特定できず、結果として全行をスキャンするフルテーブルスキャンになってしまいます。

動作確認用のサンプルテーブルを作成する

まず、検証用のテーブルを作成します。作成クエリは以下の通りです。

mysql> create table TrailingWildCardDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> Name Varchar(20),
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.71 sec)

次に、INSERTコマンドを使ってサンプルデータを挿入していきます。

mysql> insert into TrailingWildCardDemo(Name) values('John');
Query OK, 1 row affected (0.13 sec)
mysql> insert into TrailingWildCardDemo(Name) values('Johnson');
Query OK, 1 row affected (0.17 sec)
mysql> insert into TrailingWildCardDemo(Name) values('Mike');
Query OK, 1 row affected (0.16 sec)
mysql> insert into TrailingWildCardDemo(Name) values('Kevin');
Query OK, 1 row affected (0.23 sec)
mysql> insert into TrailingWildCardDemo(Name) values('Adam');
Query OK, 1 row affected (0.20 sec)
mysql> insert into TrailingWildCardDemo(Name) values('Ethan');
Query OK, 1 row affected (0.16 sec)
mysql> insert into TrailingWildCardDemo(Name) values('James');
Query OK, 1 row affected (0.19 sec)

SELECT文で、テーブル内のすべてのレコードを表示してみましょう。

mysql> select *from TrailingWildCardDemo;

実行結果は以下の通りです。

+----+---------+
| Id | Name    |
+----+---------+
|  1 | John    |
|  2 | Johnson |
|  3 | Mike    |
|  4 | Kevin   |
|  5 | Adam    |
|  6 | Ethan   |
|  7 | James   |
+----+---------+
7 rows in set (0.00 sec)

後方ワイルドカードを使った検索クエリの実行例

それでは、後方ワイルドカードを使った実際の検索クエリを見てみましょう。ここでは「j」で始まる名前を検索します。

mysql> select *from TrailingWildCardDemo where Name LIKE 'j%';

実行結果は以下の通りです。

+----+---------+
| Id | Name    |
+----+---------+
|  1 | John    |
|  2 | Johnson |
|  7 | James   |
+----+---------+
3 rows in set (0.00 sec)

このように、ワイルドカードを末尾に配置することで、インデックスを有効活用した高速な部分一致検索が実現できます。逆に、どうしても中間一致・前方一致以外の柔軟な検索が必要な場合は、全文検索インデックス(FULLTEXT INDEX)などの別の仕組みを検討するとよいでしょう。

  1. YouTube検索を劇的に改善!高度な検索演算子とフィルターの使い方ガイド

    これからYouTuberとして活動を始めようとしている方や、自分の動画を適切なキーワードで検索結果に表示させたい方にとって、YouTubeはあらゆる世代のユーザーが動画を楽しんでいる巨大なプラットフォームです。YouTubeはユーザーがより良い検索結果を得られるよう、常に改善を重ねてきました。最近では、就寝時間にデバイスを置くよう促す「おやすみリマインダー機能」も追加されています。 YouTubeで正確なキーワード検索を行うには? ここでは、YouTubeの高度な検索を活用するためのコツをいくつかご紹介します。これらのテクニックを覚えておけば、膨大な動画が存在するプラットフォーム上でも、目的の

  2. Advanced System OptimizerでWindowsパソコンのパフォーマンスを改善する方法

    記事の要点:パソコンから最高のパフォーマンスを引き出したいなら、適切なメンテナンス方法を知ることが不可欠です。システムをベストな状態で動かすためには、最適化された環境を保つことが何より重要です。本記事では、Advanced System Optimizerを活用してWindows PCのパフォーマンスを向上させる方法をご紹介します。 パソコンが遅くなる原因とは? 「最近パソコンの動きが遅い…」と感じている方に向けて、その原因と対策を分かりやすく解説します。毎日使う方でも、たまにしか使わない方でも、快適にサクサク動くパソコンは誰もが望むところです。新しいパソコンは動作が軽やかですが、時間が経つ