7

MySQLクエリSQLでプレフィックス文字列が一致する面白いケースを見つけました。

私はこのようなテーブルを作成しました。

CREATE TABLE `EpgInfo` (
   `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
   `title` varchar(100)  NULL NOT NULL DEFAUL '',
   PRIMARY KEY (`id`),
   KEY `title` (`title`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

次に、長さが20未満のランダムな列タイトルに1,000,000行のデータを挿入しました。

私は次のような3つのSQLを使用しています。

  • SQL#1:select * from EpgInfo2 where title like "快" limit 1;
  • SQL#2:select * from EpgInfo2 where title = "中" limit 1;
  • SQL#3:select * from EpgInfo2 where title like "中" limit 1;

そして私はそれを見つけました:

  • SQL#1のコストは0.2秒です。
  • SQL#2とSQL#3のコストは0.0秒です。%handl%クエリプランを見つけるためにshowstatusを使用しましたが、SQL#1はすべてのインデックスデータをスキャンしましたが、SQL#2とSQL#3はスキャンしませんでした。

なんで?

4

2 に答える 2

2

MySQL がクエリを処理する方法を確認するために使用EXPLAINします。手がかりが得られる場合があります。

また、他のキャラクターも試してみてください。おそらく、MySQL はそれらの 1 つにパーセント記号が含まれていると誤解しています。

于 2012-07-08T16:25:58.023 に答える
1

「快」と「中」はどれくらい「遠く」にあるのでしょうか?

"中" が最初に検索される行である場合、2 番目と 3 番目のクエリでは 1 行だけを検索する必要があります。

もう一方が最後の行である場合は、テーブル全体をスキャンする必要があります。

于 2012-07-08T15:36:40.607 に答える