複数カラム検索をしたいと思い、リンク先の通り、
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で質問しましょう!
似たような質問が見つかりました
- Android(アンドロイド) Pixelのレコーダーで文字起こしした英文を検索する方法 4 2022/10/21 07:45
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- その他(SNS・コミュニケーションサービス) Yahoo!とGoogle検索のしくみの違いを教えてください 2 2022/08/14 01:53
- X(旧Twitter) Twitter検索から除外 1 2023/08/18 11:00
- Google Maps iPhoneのGoogle検索窓を通常の大きさに 戻す方法を教えて頂けませんか?(切実) 日本全国の 2 2022/10/02 02:08
- Safari(サファリ) iPhone 初心者にGoogle を使わないで 快適に検索するコツ方法を教えてください 4 2023/03/10 20:53
- Excel(エクセル) EXCELで参照したデータを検索したい。 2 2023/01/18 13:32
- Excel(エクセル) セルの値をグーグルで検索するエクセルVBAについて! 2 2022/08/01 21:41
- Access(アクセス) Excel や Access のフォームの中でいわゆるインターネットの検索窓のようなものを構築できま 9 2022/05/21 12:39
- au(KDDI) Android Gmail で検索して消す方法 1 2022/11/10 16:10
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
ユニーク制約とユニークインデ...
-
大量の項目を対象に効率的に検...
-
DBの定義のサイズを大きくし過...
-
INDIRECT関数の代替方法は?
-
UNIONする際、片方テーブルしか...
-
SQLServerでNULLを挿入したいです
-
SELECT文で、指定カラム以外の...
-
構造が異なる二つのテーブルをu...
-
スペースによる絞り込み検索をS...
-
LIKEの右側にカラムを指定でき...
-
Access & ADOで「'」のLIKE検索
-
カラムとコラムの使い分け
-
テーブルの列数を調べたい
-
mysqlで50音順にorder byしたい。
-
コンボボックスの抽出条件のLik...
-
連番を振る インデックス 付...
-
update時にtimestampが更新され...
-
「VARCHAR(255)」を「text」に...
-
フレンドリストのようなものを...
-
whereで全てを検索する方法
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユニーク制約とユニークインデ...
-
MySQLのKey属性「MUL」について
-
複数カラム検索で、LIKE "%検索...
-
データベースの設計について教...
-
インデックスを張るべき項目に...
-
UPDATEつてインデックス貼って...
-
削除ふらぐ
-
インデックスについて
-
SQL Server Management Studio...
-
3テーブルより抽出のSQL文
-
MySQLのauto incrementについて
-
INDIRECT関数の代替方法は?
-
一部のカラムでdistinctし全て...
-
SQLServerでNULLを挿入したいです
-
テーブルの列数を調べたい
-
SELECT文で、指定カラム以外の...
-
DBの定義のサイズを大きくし過...
-
now()かCURRENT_TIMESTAMPか
-
LIKEの右側にカラムを指定でき...
-
UNIONする際、片方テーブルしか...
おすすめ情報