![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
こんにちは、データベース初心者です。
――――
id | tag
――――
1 | 1002
1 | 1004
1 | 4005
2 | 3001
というような、IDに複数の検索用タグが付いているテーブルに対して、
select TB2.id
from tb as TB1
inner join tb as TB2 on TB2.id=TB1.id
where TB1.tag=1002 and TB2.tag=1004
limit X,Y;
というような、任意の数(例は2個)の指定したtagを全て含むIDを検索するクエリがあります。
(指定が3個の場合は単純にinner join を増やしています)
で、指定のtagが1つの場合は一瞬で返されるのですが、
複数指定の場合に何秒もかかるときがありまして、
一瞬で返させるには一体どこを直せばよいのかがわからないのです。
クエリを変えるのか、テーブル構成を変えるのか、マシンを変えなきゃ無理なのか、
こういった場合のセオリーなど、ご指導願いたいのです。
2つ目の質問として、
order by が無い場合というのは、データに大きな変更が無い期間中は、
同じクエリであれば同じ順序で返ってくると考えて良いのでしょうか?
というのも、上記クエリにorder byを付けたかったのですが、
ソート項目が多数あり断念しまして、ただページング機能は付けたく思いまして。
環境は、ローカルで、winXP、MySQL 5.1、PHP経由で、ブラウザから操作・表示しています。
id数が約1000万、tagは500種ほどあり、1idに対して1~30個ほどで平均8個くらい付いており、
テーブルのレコード数は約8000万となっています。
素人質問で恐縮ですがよろしくお願いします。
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
ごめんなさい元のSQLをコピっちゃいました
こちらで
select id
from tb
where tag IN(1002,1004)
group by id
having count(distinct tag)=2
回答ありがとうございます。
試しましたところ、最初は強制終了するほど遅かったのですが、
仰るとおり適切なインデックスを使ってくれなかったようで、
use index で(tag,id)の複合?インデックスを指定しましたところ、
4秒くらいで返すようになりました。
で、何度か試しているうちにin句に同じtag、同じ順序で指定したにも関わらず、
なぜか短縮され、2秒くらいで返すようになりました。
試し方が悪かったのかも知れませんが、その後は一応安定しており、
また、教えて頂いたSQLの方が組みやすく、非常に勉強になりました。
冒頭で「とりあえず」と仰っているので、第二第三の策が気になりますが、
この度は誠にありがとうございました。
No.2
- 回答日時:
とりあえず
select TB2.id
from tb as TB1
inner join tb as TB2 on TB2.id=TB1.id
where TB1.tag=1002 and TB2.tag=1004
ただし、idとtagをつかったindexが設定されていないとスピードは
保障されません
No.1
- 回答日時:
1)EXPLAINを使って分析し、インデックスを適切に設定する
2)ORDERをつけない場合常に同じ順番で取得する保証は一切ありません。
回答ありがとうございます
1)btreeというタイプのインデックスを両カラムに指定しており、
explainではusing indexと出ています。
他にはusing temporaryとusing whereというのも出ているのですが、
正直explainを見て、よしじゃぁこうした方がいいなというのが思い付きません。
勉強不足なのは承知していますが、何かアドバイスありましたら宜しくお願いします。
2)保証がない以上ページング目的で同順を期待するのはやめた方が良さそうですね…。
貴重なご意見ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) アクセス 削除するレコードを含んだテーブルを指定してくださいのエラー対処方法 1 2022/11/24 15:01
- MySQL PhpMyAdminで作成して実行せよ。 東京23区を、皇居を中心とした4つのエリア(南東, 南西, 1 2023/06/11 11:58
- その他(データベース) accessでの請求管理について 2 2022/06/13 21:51
- Access(アクセス) アクセス テーブルの空白を変数に置換するボタンが作りたい 4 2022/07/08 11:19
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- Access(アクセス) アクセス where句を使用して複数条件抽出をするには 2 2022/08/29 13:24
- Access(アクセス) AccessVBAで降順にするテーブル作成クエリを使用して作成したテーブルを削除し同一のテーブル作成 1 2023/01/06 11:17
- SQL Server ACCESSで表が作りたく、そのためのSQL文や設定方法を教えてください。 1 2022/08/15 12:28
- MySQL SQLです。こんな感じですか?あってますか? うまくいきません教えてくださいお願いします 1 2023/07/08 15:27
- その他(データベース) 更新クエリをリンクデータベーステーブルに実行し実行時エラー3362固有インデックスに重複する値が含ま 1 2022/09/21 11:44
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
PL/SQLの変数について
-
別テーブルからSELECTした値を...
-
マイクラPC版のコマンドで効率...
-
少し前に放送されていたオムツ...
-
SQL Left Join で重複を排除す...
-
副問合せの書き方について
-
ある条件の最大値+1を初番する...
-
全角文字を含む行を検索
-
期間の重複を調べるSQL文につい...
-
複数のテーブルの検索について
-
書籍の内容はまともでしょうか?
-
一つ前のレコードの値と減算し...
-
SQLサーバから、項目の属性(型...
-
主キーが文字型での結合
-
[MySQL] 3つのテーブルの結合で...
-
inner joinをすると数がおかし...
-
クエリ表示と、ADOで抽出したレ...
-
C言語のタグの抽出について
-
C言語 プログラミング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで最後の文字だけ置き...
-
副問合せの書き方について
-
SQLサーバから、項目の属性(型...
-
SQL Left Join で重複を排除す...
-
select文のwhere句に配列を入れ...
-
VIEWの元のテーブルのindexって...
-
PL/SQLの変数について
-
マイクラPC版のコマンドで効率...
-
エクセルの関数について教えて...
-
SQLにて特定の文字を除いた検索...
-
sqlで、600行あるテーブルを100...
-
Access パラメータクエリをcsv...
-
Unionした最後にGROUP BYを追加...
-
inner joinをすると数がおかし...
-
複数テーブルのGROUP BY の使い...
-
ある条件の最大値+1を初番する...
-
MySQLのint型で001と表示する方...
-
クエリ表示と、ADOで抽出したレ...
-
[MySQL] UNIQUE制約の値を更新...
-
テーブル名を省略して「h.id」...
おすすめ情報