解決済みの質問
テーブルにおけるINDEXの設定
テーブルにおけるINDEXの設定
こんにちは。
MySQLのテーブル設計について質問です。
テーブルを以下のように設計し、
(カラム名:データ型)
CustomerCd:int
ItemCd:int
利用者(CustomerCd)が登録した複数の異なるItemCdを、グループで取り出す処理をしたいとします。
select ItemCd from TableName where group by $CustomerCd;
これは例えば、ECサイトでいうと「気になるリスト」のDB保存のような使い方をします。
また、参照の他に、高頻度で削除と追加が行われる見込みです。
delete $ItemCd from TableName where CustomerCd = $CustomerCd;
insert * into TableName values($CustomerCd,$ItemCd);
こういった場合、
①このテーブルにはユニークな値はありません(レコード行を特定する必要もありません)が、システムに何か問題が起きることが予見できますか?(ユニークな値は必要なくとも作るものですか?)
②CustomerCdとItemCdは、このテーブルでは重複しますが、INDEXを付ける必要性はありますか?オーバーライトになりそうだと思うのですが・・・。
経験が少ないためいまいち勘所がわかっていません。
宜しくお願い申し上げます。
- 補足
- 詳しいご回答、ありがとうございます。
「CustomerCdとItemCdで一意にしない理由が・・・」や「CustomerCd,ItemCd」でINDEX設定する、というのがわからないのですが、
複数カラムを組み合わせて一意と出来るのですか?それとも、データ挿入段階で2つの文字列を合成し、一つの列に挿入するということでしょうか。
-
- 質問日時:
- 2011/6/8 19:05:48
-
- 解決日時:
- 2011/6/9 08:55:03
-
- 回答数:
- 1
-
- お礼:
- 知恵コイン
- 100枚
-
- 閲覧数:
- 98
-
- ソーシャルブックマークへ投稿:
- Yahoo!ブックマークへ投稿
- はてなブックマークへ投稿
- (ソーシャルブックマークとは)
ベストアンサーに選ばれた回答
全体の件数にもよると思います。件数が多いと
「select ItemCd from TableName where group by $CustomerCd;」は全件読み込みしますから、よほどメモリバッファがないと、大量DISK I/Oが発生し、
「delete $ItemCd from TableName where CustomerCd = $CustomerCd;」
「insert * into TableName values($CustomerCd,$ItemCd);」
をブロックします。そもそも、INDEXがないと、このDELETE文が全件読み込みを発生させます。
私なら「CustomerCd,ItemCd」でINDEX作成します。
(1),(2)ともですが、CustomerCdとItemCdで一意にしない理由が逆に分かりません。
- 違反報告
- 回答日時:2011/6/9 00:31:53
- この質問・回答は役に立ちましたか?
- 役に立った!
お役立ち度:
0人が役に立つと評価しています。


質問した人からのコメント
大変役に立つ気付きをありがとうございます!!