たとえば、こちらに「こだわり条件で絞り込む」という機能があります。
http://www.athome.co.jp/bklist?ITEM=ks&ART=13&AR …
MYSQLでこのような機能を実現する場合、
1項目1カラム、全てにインデックスを設定。
または
該当する項目を1カラムにまとめて格納し(CS,CATV,グルニエ,…)、その中に一致する文字の有無を判断させる。
どのような構造だと効率的に動くようになるのでしょうか?
No.3ベストアンサー
- 回答日時:
市町村の指定だと、
データ上は1項目しかないはずなので
in ('東京都千代田区',・・・)に選択した項目の内容を入れる。
(データ上にコードで持っていて、in句の中もコードを指定するほうが早いですが。)
こだわり条件のほうでは、例えば、
「収納」を例とすると、
ウォークインクローゼット(0)床下収納(0)
を、
「ウォークインクローゼット、床下収納」と格納し、
検索は一致する文字列を検索するという方法1と、
「11」(1文字目は、ウォークインクローゼット有無で1はあり。2文字目は、床下収納有無で・・・)
と格納し、like演算子を利用して'11'を探す。
ウォークインクローゼットのみチェックなら、'1?'を探す。
とする方法2とあります。
ばらばらに項目として持つ方法3もありますが。
方法1:検索はやや遅い。プログラムも分かりやすいが、「ウォークインクローゼット」をただの「クローゼット」に変える等の名称変更の対応が面倒(データ全件修正必要)。
方法2:検索はやや早い。プログラムは分りにくくなり、追加や削除の対応が面倒。
(ビットマップインデックスが使えるなら、同じような考え方で、検索はより早くなります)
方法3:全件検索に近くなってしまい遅くなる可能性が高い。
(すべての項目に個別にインデックスをつけても、複数の条件を指定されたら、検索時にはどれか1個しかインデックスはつかえないのでほぼ一緒。)
プログラムは分りやすく、追加や削除、変更への対応は簡単。
どれも一長一短なので、要件にあわせて何を優先するかで選んでください。
ありがとうございます。
>in ('東京都千代田区',・・・)に選択した項目の内容を入れる。
選択するたびにin()の中に追加して検索させるんですね。
>(データ上にコードで持っていて、in句の中もコードを指定するほうが早いですが。)
コードを持っていく、指定するとは何ですか?
方法2は指定する項目が30あれば
00100010100011100000001100100
といったデータを格納するということですね。
方法1と2は管理がすごく大変そうです。
方法3が形としてはいいですが、遅いのが残念です。
Postgresqlなら高速に動き、管理も楽…MYSQLにはムリなのですね
No.5
- 回答日時:
ANO.3ですが。
>(データ上にコードで持っていて、in句の中もコードを指定するほうが早いですが。)
コードを持っていく、指定するとは何ですか?
物件テーブル上は、
101とか102とかコードでもっていて
住所マスタで、
101,'東京都千代田区'
・・・
を別に持つ。
画面は住所マスタから選択肢を表示し、
チェックされたら
in('101','102'・・・)
のようにコードでin句を組み立てるという意図でした。
>方法2は指定する項目が30あれば
>00100010100011100000001100100
>といったデータを格納するということですね。
その通りです。
但し、全部1つにする必要はなく、条件の分類毎に1項目作ればいいと思います。
例えば、先ほどの回答では、「収納」が2桁、「・・・」がn桁・・・という感じです。
何も指定されていなければ、select文のwhere句の中に入れる必要ないので。
方法2の下に
「(ビットマップインデックスが使えるなら、同じような考え方で、検索はより早くなります)」
をつけたのは誤解を招いたかもしれません。
方法3のやり方で、方法2のような検索処理をしてくれるというイメージが近いです。
MySQLにはないようですのであまり書く意味が無かったですが。
No.4
- 回答日時:
そんなに深く考えなくても
条件テーブル、物件テーブル、条件=物件テーブルの3つに分ければ
それなりにはやく、拡張性も高い構成になります
条件テーブルに条件をカテゴライズするカラムを用意しておけばより
検索性があがります
MYSQLですむ方法があるんですね!
http://www.athome.co.jp/bklist?ITEM=ks&ART=13&AR …
こちらの場合は
価格、間取り、建物面積、土地面積、駅からの徒歩、築年数、情報公開日、アピール、画像、人気のこだわり条件、という検索条件があります。
>条件テーブル、物件テーブル、条件=物件テーブルの3つに分ければ
こういうことでしょうか。
条件テーブル(人気のこだわり条件):
条件ごとにbool型のカラムに0か1を入れる。
---------------------------------------
id | CS | CATV | グルニエ | …
---------------------------------------
11220|0 |1 |0 | …
11221|1 |1 |1 | …
物件テーブル:
価格、間取り、建物面積、土地面積、駅からの徒歩、築年数、情報公開日、アピール、画像
---------------------------------------
id | 価格 | 間取り | 建物面積 | …
---------------------------------------
11220|2220 |3LDK |110.98 | …
11221|3220 |1K |500.00 | …
条件=物件テーブル:
こちらは何の目的でしょうか。
>条件テーブルに条件をカテゴライズするカラムを用意
カテゴリー化したカラムを条件テーブルに追加
---------------------------------------
id | CS | CATV | 水周り | …
---------------------------------------
11220|0 |1 |0 | …
11221|1 |1 |1 | …
ということですか?
No.2
- 回答日時:
そもそも、このような検索ならビットマップインデックスを使用できるPostgresqlのほうが向いているのではないでしょうか。
MySQLを選択せざるを得ない理由があるのなら別ですが。
http://www.athome.co.jp/bklist?ITEM=ks&ART=13&AR …
いろんな検索、表示順序の変更、何件中何件、1ページ目、とりあえず保存機能、いろいろ機能がありますが、画像は格納する予定はありませんが、こういったものはPostgresqlでやるのが基本ですか?
情報を登録したり更新したりするのは自分一人だけです。
>そもそも、このような検索ならビットマップインデックスを使用できる
>Postgresqlのほうが向いているのではないでしょうか。
MYSQLは機能の豊富さも充実していて、それでありながら一番高速、業界でもシェアNO1、最強のデータベースはMYSQLらしいので、パフォーマンスが落ちなければ、できればMYSQLでやりたいと思っています。
No.1
- 回答日時:
全て(出来る限り)の項目をBOOL型にする。
>1項目1カラム、全てにインデックスを設定。
ほとんどの項目は有るか無いかになるのでインデックスを作っても無駄。
>該当する項目を1カラムにまとめて格納し(CS,CATV,グルニエ,…)、その中に一致する文字の有無を判断させる。
最悪の手法でしょう。
>全て(出来る限り)の項目をBOOL型にする。
それぞれの項目に入れるデータは「0と1」か「trueとfalse」どちらのほうが軽いですか?
>ほとんどの項目は有るか無いかになるのでインデックスを作っても無駄。
これらのカラム全部インデックス付けていないのですか。
格納するデータが1カラムに何種類以上でインデックスは役に立ちますか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(クラウドサービス・オンラインストレージ) おすすめのパスワードマネージャは? 1 2023/02/28 20:09
- 電気・ガス・水道業 簡易専用水道の定期清掃について 3 2023/03/26 16:36
- Chrome(クローム) Google Chrome の「拡張ブックマークを有効にする」の項目がどこにあるのか教えてください 2 2023/05/26 21:22
- Visual Basic(VBA) VBAで、1つのエクセルで、2つのシートからもう1つのシートに条件のある転記コードを教えてください。 1 2023/03/16 18:07
- Wi-Fi・無線LAN PCWi-Fiの設定方法がわからなくて困っています。 4 2022/12/28 18:30
- 統計学 統計に関する質問です 3 2022/05/19 20:21
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/10 08:51
- その他(プログラミング・Web制作) マウスオーバー→ホイール回転でスクロールできない 2 2022/10/31 10:06
- 簿記検定・漢字検定・秘書検定 簿記一級を取るべきかわからず困っています。 簿記一級とその他学外活動の各コストパフォーマンス(費用対 3 2022/08/21 20:16
- 日本語 「判断文」は「は」、「現象文」は「が」 6 2022/11/19 19:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
複数カラム検索で、LIKE "%検索...
-
DBの定義のサイズを大きくし過...
-
INDIRECT関数の代替方法は?
-
SQLServerでNULLを挿入したいです
-
UNIONする際、片方テーブルしか...
-
ドロップダウンリストの連動し...
-
SELECT文で、指定カラム以外の...
-
GREATESTで NULLをスルーする方...
-
sql , insert で空行(全ての列...
-
MYSQLで全てのカラムから検索す...
-
[MySQL]LOAD DATA INFILE一部レ...
-
mysqlで50音順にorder byしたい。
-
一部のカラムでdistinctし全て...
-
列を行に表示する方法は?
-
LIKEの右側にカラムを指定でき...
-
カラムをコピーして、新規カラ...
-
構造が異なる二つのテーブルをu...
-
テーブルの列数を調べたい
-
SQLでカラムを追加し、条件に合...
-
type date にnullをinsert
マンスリーランキングこのカテゴリの人気マンスリー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する際、片方テーブルしか...
おすすめ情報