複数カラム検索をしたいと思い、リンク先の通り、
WHERE concat(field1,char(0),field2) LIKE "%検索語%"
としたらうまくいったのですが、
そのページに書いてあることが気になるので、教えてください
▽MySQLで複数フィールドから同一語を検索するには・・・ - MySQL - 教えて!goo
http://oshiete.goo.ne.jp/qa/2634613.html
・char(0)て何でしょうか?
>%データ%は全件を検索するため効率うんぬんを論ずるような仕組みではない
・どういう意味でしょうか?
・全件検索する際は、LIKE検索を使わないのでしょうか? 全文検索エンジン(?)を利用するのでしょうか?
・全件検索しなければ(例えば2カラムだけ)、LIKE検索を利用しても良いのでしょうか?
・あるいは、データ規模が少なければ、LIKE検索を利用しても良いのでしょうか?
>本番ではこんなことはしませんがあくまでも遊びということで
・どういう意味でしょうか?
・concatで LIKE 検索を普通はしない、ということでしょうか?
・それとも、LIKE 検索で、char(0)などのセパレータを挟まない、ということでしょうか?
・あるいは、全件検索でLIKE検索を普通は使わない、ということでしょうか?
No.2ベストアンサー
- 回答日時:
> ・char(0)て何でしょうか?
「検索語にはありえない文字」です。char(0)は、文字コード0の文字。以下の説明では\0と書きます。
例えば、検索語が"%おか%"で、field1="あいうえお"で、field2="かきくけこ"だった場合、
concat(field1,field2)は"あいうえおかきくけこ"となり、検索条件にマッチします。
ところが、concat(field1, char(0), field2) は、"あいうえお\0かきくけこ"となるため、
こうしておけば"%おか%"はマッチしない、ということになります。
> >%データ%は全件を検索するため効率うんぬんを論ずるような仕組みではない
> ・どういう意味でしょうか?
前後にワイルドカードをつけたLIKE 検索(いわゆる「部分位置検索」)は、効率が非常に悪いからです。
通常の検索(完全一致や範囲指定などによる絞り込み)では、DBにインデックスをつけることで、条件に該当するレコードを高速に抽出することができます。
(LIKEを使う場合でも、後ろにだけワイルドカードをつけた「データ%」のような、いわゆる「前方一致検索」は、インデックスが使えるので問題ありません。)
ところが、前にワイルドカードをつけた場合、インデックスが使えませんので、
DBの全レコードを1件ずつ読み込んで条件に合致するかチェックする必要がある、ということになります。
検索にはレコード数に比例した時間がかかるという、非常に効率が悪いものになってしまうのです。
> ・あるいは、データ規模が少なければ、LIKE検索を利用しても良いのでしょうか?
それが問題にならない程度の規模ならLIKEの前後ワイルドカード(部分一致検索)をしてもいいでしょう。
> ・全件検索する際は、LIKE検索を使わないのでしょうか? 全文検索エンジン(?)を利用するのでしょうか?
規模が大きくなった場合には、全文検索エンジンを使うのが基本です。
> ・全件検索しなければ(例えば2カラムだけ)、LIKE検索を利用しても良いのでしょうか?
「例えば2カラムだけ」というのが意味不明ですが、
問題はチェック対象のレコード数(行数)です。カラム数(列数)は問題になりません。
全件検索でなくても、チェック対象のレコード数が多い場合にはLIKE部分一致検索はしない方がいいでしょう。
LIKE検索以外の条件で、チェック対象が十分に絞り込めているなら、LIKE部分一致検索をしても大丈夫ということになります。
> >本番ではこんなことはしませんがあくまでも遊びということで
> ・どういう意味でしょうか?
上述のように性能が出せないので、大規模業務システムではそんなものは使わない、ということです。
> ・あるいは、全件検索でLIKE検索を普通は使わない、ということでしょうか?
LIKE検索でも、「あるカラムのみをチェック対象(LIKEの左辺)」とし、「頭には%をつけない前方一致検索」を行うのであれば問題ありません。
> ・concatで LIKE 検索を普通はしない、ということでしょうか?
> ・それとも、LIKE 検索で、char(0)などのセパレータを挟まない、ということでしょうか?
LIKE対象の前に%をつける「部分一致検索」は普通はしない、ということです。
さらにいうと、あと、カラムそのものではなく、concat した文字列に対してのLIKE 検索だと、「データ%」のような前方一致検索でも、左辺側にインデックスが使えませんので、やっぱり効率が悪くなりますので使えません。
No.1
- 回答日時:
Char(0)はキャラクターつまり文字数をゼロという意味で、間を詰める事になります。
つまりブランクを作るとうまく検索できないということでしょう。LIKE検索はインデックスのついてないあくまでも簡易検索であり、クエリにとっては重い処理です。普通は検索項目にインデックスをつけて検索を早くしますが、LIKEではそのフィールドを一文字ずつ検査してその文字が無いかを判断しているのです。それに時間が掛かります。
カラム数には関係ありません。データー規模が少なければ問題はありません。増えれば増えるだけ遅いということです。
通常は全文検索インデックスを作成した項目に対して別のコマンドで処理します。全文検索インデックスは作製に時間がかかります。つまり書き込みが多いテーブルには不向きです。検索系のテーブルにつけるのが普通です。その場合は高速検索ができます。
先に述べたようにconcatする事自体に時間がかかり、さらにLIKEで時間がかかります。現実的では無い処理です。
SQLとは別に神様言語ではありません。裏では記憶域に別領域を取ってデーターを比較するなど地道な処理を行います。もしこれらの処理を人間がする場合を想定すればよいだけです。項目をくっつけてさらに一文字ずつ比較するって大変ですよね。
先にキーワードを作っておいた方が楽でしょう。同じなのです。
回答ありがとうございました。
>SQLとは別に神様言語ではありません。裏では記憶域に別領域を取ってデーターを比較するなど地道な処理を行います
説明が分かりやすかったですー
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
MySQLで複数フィールドから同一語を検索するには・・・
MySQL
-
複数フィールド対してLIKE '% %' したい
MySQL
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
大量の項目を対象に効率的に検...
-
DBの定義のサイズを大きくし過...
-
UNIONする際、片方テーブルしか...
-
MySQLで先頭にカラムを追加
-
テーブルの列数を調べたい
-
一部のカラムでdistinctし全て...
-
SQLServerでNULLを挿入したいです
-
LIKEの右側にカラムを指定でき...
-
INDIRECT関数の代替方法は?
-
now()かCURRENT_TIMESTAMPか
-
カラムをコピーして、新規カラ...
-
DBエラーの意味
-
MYSQLのストアドでの動的SQLに...
-
SQLでカラムを追加し、条件に合...
-
WHEREなどの条件が多い場合、ど...
-
JDBCドライバがない?
-
MYSQLで全てのカラムから検索す...
-
最大2147483647なのに何故int(1...
-
インデックス再構築中のSELECT
-
AUTO_INCREMENTに0はダメ?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
SQL Server Management Studio...
-
ユニーク制約とユニークインデ...
-
複数カラム検索で、LIKE "%検索...
-
オートインクリメントについて
-
データベースの設計について教...
-
MySQLのKey属性「MUL」について
-
MySqlでのデータソートについて
-
インデックスを張るべき項目に...
-
INDIRECT関数の代替方法は?
-
DBの定義のサイズを大きくし過...
-
一部のカラムでdistinctし全て...
-
テーブルの列数を調べたい
-
now()かCURRENT_TIMESTAMPか
-
SQLServerでNULLを挿入したいです
-
MYSQLで全てのカラムから検索す...
-
GREATESTで NULLをスルーする方...
-
LIKEの右側にカラムを指定でき...
-
SELECT文で、指定カラム以外の...
-
BULK INSERT時のNull許容について
-
SQLでカラムを追加し、条件に合...
おすすめ情報