
複数カラム検索をしたいと思い、リンク先の通り、
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も見ています
関連するカテゴリからQ&Aを探す
今、見られている記事はコレ!
-
弁護士が解説!あなたの声を行政に届ける「パブリックコメント」制度のすべて
社会に対する意見や不満、疑問。それを発信する場所は、SNSやブログ、そしてニュースサイトのコメント欄など多岐にわたる。教えて!gooでも「ヤフコメ民について」というタイトルのトピックがあり、この投稿の通り、...
-
弁護士が語る「合法と違法を分けるオンラインカジノのシンプルな線引き」
「お金を賭けたら違法です」ーーこう答えたのは富士見坂法律事務所の井上義之弁護士。オンラインカジノが違法となるかどうかの基準は、このように非常にシンプルである。しかし2025年にはいって、違法賭博事件が相次...
-
釣りと密漁の違いは?知らなかったでは済まされない?事前にできることは?
知らなかったでは済まされないのが法律の世界であるが、全てを知ってから何かをするには少々手間がかかるし、最悪始めることすらできずに終わってしまうこともあり得る。教えてgooでも「釣りと密漁の境目はどこです...
-
カスハラとクレームの違いは?カスハラの法的責任は?企業がとるべき対応は?
東京都が、客からの迷惑行為などを称した「カスタマーハラスメント」、いわゆる「カスハラ」の防止を目的とした条例を、全国で初めて成立させた。条例に罰則はなく、2025年4月1日から施行される。 この動きは自治体...
-
なぜ批判コメントをするの?その心理と向き合い方をカウンセラーにきいた!
今や生活に必要不可欠となったインターネット。手軽に情報を得られるだけでなく、ネットを介したコミュニケーションも一般的となった。それと同時に顕在化しているのが、他者に対する辛らつな意見だ。ネットニュース...
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エラー 1068 (42000): 複数の主...
-
mysqlがインストールされている...
-
#1062 - '0' は索引 'PRIMARY' ...
-
テーブル名が可変の場合のクエ...
-
SQLです教えてください。
-
SQLです教えてくださいお願いし...
-
MAMP 99ドル約1.6万円 高い...
-
SQLです教えてくださいお願いし...
-
SQLでカラムを追加し、条件に合...
-
SQLです教えてくださいお願いし...
-
(初心者)MySQLやmaraDBで、crea...
-
utf8bomとutf8mb4の違いがいま...
-
テーブル:生徒名簿 生徒名簿の...
-
mysqlのupdate構文についての質...
-
同一日に複数レコードがある場...
-
SQLを作ったのですがうまくいき...
-
SQLです教えてくださいお願いし...
-
SQLあってますか?こう?
-
SQLです!!教えてください。あ...
-
次の時間帯の勝率の合計を求め...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ユニーク制約とユニークインデ...
-
複数カラム検索で、LIKE "%検索...
-
SQL Server Management Studio...
-
データベースの設計について教...
-
インデックスについて
-
他のシートの検索
-
一部のカラムでdistinctし全て...
-
SELECT文で、指定カラム以外の...
-
DBの定義のサイズを大きくし過...
-
INDIRECT関数の代替方法は?
-
UNIONする際、片方テーブルしか...
-
AUTO_INCREMENTに0はダメ?
-
BULK INSERT時のNull許容について
-
テーブルの列数を調べたい
-
構造が異なる二つのテーブルをu...
-
now()かCURRENT_TIMESTAMPか
-
MYSQLで全てのカラムから検索す...
-
ホームページを作ろうと思いま...
-
SQLServerでNULLを挿入したいです
-
【Transact-sql】 where条件、i...
おすすめ情報