ここから本文です

解決済みの質問

テーブルにおけるINDEXの設定

psalm3721さん

テーブルにおける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つの文字列を合成し、一つの列に挿入するということでしょうか。

違反報告

ベストアンサーに選ばれた回答

nora1962jpさん

全体の件数にもよると思います。件数が多いと
「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 08:55:03

グレード

この質問・回答は役に立ちましたか?
役に立った!

お役立ち度:お役立ち度 0点(5点満点中)0人が役に立つと評価しています。

知恵ノートとは?

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。

お客様自身の責任と判断で、ご利用ください。

ただいまの回答者

16時23分現在

2889
人が回答!!

1時間以内に5,307件の回答が寄せられています。

>>回答ひろばに行く


知恵コレに追加する

閉じる

知恵コレクションをするID/ニックネームを選択し、「追加する」ボタンを押してください。
※知恵コレクションに追加された質問や知恵ノートは選択されたID/ニックネームのMy知恵袋で確認できます。

ほかのID/ニックネームで利用登録する