• ベストアンサー

インデックスとLIKE演算

MySQLを勉強中です。 バージョン:5.x(詳しくはわかりません) エンジン:InnoDB インデックスを指定したカラムに対してLIKE演算"%検索文字%"を実行するとシーケンシャルに検索を行うと聞きましたが、何か回避する方法等はありませんでしょうか? ※インデックスを指定したカラムの型はchar(255)で、日本語(UTF-8)も含まれます。

noname#153830
noname#153830
  • MySQL
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

>LIKE演算"%検索文字%" LIKEのインデックスが有効なのは、前方一致もしくは後方一致の いずれかですから、動くけどチューンアップできないよくある例です。 どんなデータ検索を想定しているのかわかりませんが、 場合によってはキーワードをスペースで分かち書きして 全文検索するなどなんらかの対応が必要かもしれません。

noname#153830
質問者

お礼

ありがとうございました

関連するQ&A

  • 複数カラム検索で、LIKE "%検索語%"

    複数カラム検索をしたいと思い、リンク先の通り、 WHERE concat(field1,char(0),field2) LIKE "%検索語%" としたらうまくいったのですが、 そのページに書いてあることが気になるので、教えてください ▽MySQLで複数フィールドから同一語を検索するには・・・ - MySQL - 教えて!goo   http://okwave.jp/qa/q2634613.html ・char(0)て何でしょうか? >%データ%は全件を検索するため効率うんぬんを論ずるような仕組みではない ・どういう意味でしょうか? ・全件検索する際は、LIKE検索を使わないのでしょうか? 全文検索エンジン(?)を利用するのでしょうか? ・全件検索しなければ(例えば2カラムだけ)、LIKE検索を利用しても良いのでしょうか? ・あるいは、データ規模が少なければ、LIKE検索を利用しても良いのでしょうか? >本番ではこんなことはしませんがあくまでも遊びということで ・どういう意味でしょうか? ・concatで LIKE 検索を普通はしない、ということでしょうか? ・それとも、LIKE 検索で、char(0)などのセパレータを挟まない、ということでしょうか? ・あるいは、全件検索でLIKE検索を普通は使わない、ということでしょうか?

    • ベストアンサー
    • MySQL
  • インデックスについて

    宜しくお願いします。 MySQLで検索速度を上げる為にカラム毎に設定するINDEXですが、 fulltextとindexの2種を使えば、全カラムにINDEXを付けられると思いますが、検索するか分からないカラムにもINDEXをつけた場合、何か不都合がおこりますか? 例えば、INDEXが多すぎると逆に検索が遅くなるなどです。 ちなみに、fulltextは日本語に対応していないのは理解しております。

    • ベストアンサー
    • MySQL
  • MySQL3.23.58でインデックスは使えますか?

    phpinfoでmysqlの項目を確認したところ Client API version 3.23.58 となっていました。 mysql3.23.58でindexを使う場合、何か注意する点などありますか? 型に制限があったりするのでしょうか?

    • ベストアンサー
    • MySQL
  • LIKEで検索

    MySQL 4.0.20 + PHP で名前が入ったテーブルよりLIKEを使って検索すると全然関係のない名前まで引っ張ってきます。 SELECT * FROM `lady` WHERE name LIKE 'らむ' 上記で検索すると 「とも」って名前まで引っ張ってきます。 SELECT * FROM `lady` WHERE name LIKE 'らな' だと 「るる」って名前も引っ張ります。 どうも「ら行」の検索がうまく出来ないようです。 何か回避方法はあるのでしょうか? よろしく御願いします

    • ベストアンサー
    • MySQL
  • INDEX RANGE SCAN とは?

    OracleのINDEX RANGE SCANについての質問です。 私の理解のレベルでは、INDEX RANGE SCANは範囲検索をする時に発生し、 それ自体は効率的にインデックスを利用している状態である、と理解しています。 もっといえば、betweenを使用したり演算子に「>=」などの不等号を使用した とき以外には発生しないはずと思っていました。 しかし先日、条件部分に「=」等号しかないSQLにてINDEX RANGE SCANが発生しました。 INDEX SKIP SCAN ならまだ話はわかるのですが、間違いなくINDEX RANGE SCANでした。 範囲検索で無い場合にINDEX RANGE SCANになる意味がよくわかりません。 ■以下質問です。 範囲検索の場合にINDEX RANGE SCANになるという私の認識はあっているか。 どのような場合に、等価条件だけの場合にINDEX RANGE SCANになるのか。 等価条件だけなのにINDEX RANGE SCANになる場合、検索の仕組みについて。 ■参考情報として記述しておきます。 バージョンは9iです。 1つのテーブルに対するSELECT文で where句には4つのカラムが等価条件で指定されています。 これらのカラムは条件・カラムの値ともにNULLではありません。 関係あるかわかりませんが、カーディナリティが高いにもかかわらず 適切なインデックスが無いSQLでした。 よろしくお願いします。

  • mysqlのインデックスについて質問です。

    mysqlのインデックスについて質問です。 http://archiva.jp/web/server-side/sql_02.html に、 『mysqlでは1つのクエリ実行で、1つのテーブルにつき1つのインデックスしか使用できない』 とあります。 よく以下のようなテーブル定義を見かけますが、 CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; idとuser_idを条件にするクエリであれば、上記制約を満たすため、 KEY `id_user_id_idx` (`id`,`user_id`) の複合クエリを定義すれば良いのでしょうか? また、idとuser_idとfile_idを条件にするクエリも考慮に入れた場合、 テーブル定義は以下のようにするのでしょうか? CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `id_user_id_idx` (`id`,`user_id`), KEY `id_user_id_file_id_idx` (`id`,`user_id`,`file_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 最後に、create table 時のインデックスの指定は、 INDEX `user_id` (`user_id`), のようにもできますが、INDEXとKEYの違いは何かあるのでしょうか。

    • ベストアンサー
    • MySQL
  • LIKE %検索単語%

    perlのDBIを用いてMYSQLのLIKE %検索単語%を使って掲示板の記事の全文検索を作りました。日本語の検索に関しては意図した記事を拾ってきてくれるのですが、英字の検索単語に関して、その英字だけを含んだ以外の記事も余計に拾ってきてきます。 現在の症状 【僕らは】 【意味】 【宝山】 といった単語が入った記事が検索単語をLIKE %a% として検索をかけると 【a】の検索結果として返ってきます。上記の記事内にはもちろん【a】という単語は含まれていません。 【僕らは】【意味】【宝山】といった単語はあくまでもこういった単語が検索結果として返ってきたというだけで参考までに用意した単語です。他にもあると思われます。原因がまったくわからないので、なぜこういった単語が【a】と検索をかけて引っかかってくるか全くわかりません。 掲示板の記事は以下にいれています テーブル名 post カラム名 log select * from post where log like '%a%'; 使用中の環境(PERL,MYSQLなど)の文字コードはすべてutf8で統一。 文字コードも統一しているし、日本語では意図したとおり動いてくれるので原因がまったくわかりません。お知恵をお貸しください。

  • PHPからのLIKE検索ができません。

    こんばんわ。お世話になります。 PHPからSQLを発行してLIKE検索をしようとしているのですがうまくいきません。(Xampp MySQL) $keyword = htmlspecialchars($_POST['keyword']); mysql_real_escape_string($keyword); $sql = "select * from master where name like '%{$keyword}%'"; テーブル内の name にマッチするはずの言葉があるのにマッチしません。 ちなみに echo $sql; とSQL文を表示させてPhpMyAdminでそれを実行すると、目的の検索結果が表示されます。 いろいろ検索してみたところ、LikeをLike Binary にする方法などがありましたが、どうにもうまくいきませんでした。文字コードはフォーム側、PHP・SQLともにUTF-8です。 '%{$keyword}%'あたりの書き方が悪いのでしょうか。 お手数おかけいたしますがアドバイスの程お願いいたします。

    • ベストアンサー
    • MySQL
  • 演算子等の検索方法

    こんにちは。 プログラミングとは直接関係の無い質問ですが… 例えば型"System::String^"や、比較演算子"||"等、記号込みのワードをインターネットで検索したい場合、どのように検索をかけたら良いでしょうか? "System::String^"でそのまま検索をかけると、"System::String"までしか引っかかっていないようです。 Google、MSN、Yahoo、InfoSeekの検索エンジンで試しましたが、同じでした。。 何か良い方法は無いでしょうか?

  • WAMP Server2.0のmysqlでInnoDBを使いたい

    Windows環境でお手軽Apache+PHP+MySQLがインストールできる WAMPServer2.0をインストールして使ってみたのですが、MySQLのテーブルのエンジンタイプが InnoDBを指定できない(エラーになります)。 私はMySQLは当然InnoDBが使えると思っていたのですが、WAMPでは無理なのでしょうか? http://www.forest.impress.co.jp/article/2008/12/19/wampserver.html

    • ベストアンサー
    • MySQL