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)などの別の仕組みを検討するとよいでしょう。
-
YouTube検索を劇的に改善!高度な検索演算子とフィルターの使い方ガイド
これからYouTuberとして活動を始めようとしている方や、自分の動画を適切なキーワードで検索結果に表示させたい方にとって、YouTubeはあらゆる世代のユーザーが動画を楽しんでいる巨大なプラットフォームです。YouTubeはユーザーがより良い検索結果を得られるよう、常に改善を重ねてきました。最近では、就寝時間にデバイスを置くよう促す「おやすみリマインダー機能」も追加されています。 YouTubeで正確なキーワード検索を行うには? ここでは、YouTubeの高度な検索を活用するためのコツをいくつかご紹介します。これらのテクニックを覚えておけば、膨大な動画が存在するプラットフォーム上でも、目的の
-
Advanced System OptimizerでWindowsパソコンのパフォーマンスを改善する方法
記事の要点:パソコンから最高のパフォーマンスを引き出したいなら、適切なメンテナンス方法を知ることが不可欠です。システムをベストな状態で動かすためには、最適化された環境を保つことが何より重要です。本記事では、Advanced System Optimizerを活用してWindows PCのパフォーマンスを向上させる方法をご紹介します。 パソコンが遅くなる原因とは? 「最近パソコンの動きが遅い…」と感じている方に向けて、その原因と対策を分かりやすく解説します。毎日使う方でも、たまにしか使わない方でも、快適にサクサク動くパソコンは誰もが望むところです。新しいパソコンは動作が軽やかですが、時間が経つ