質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

3回答

2718閲覧

単体インデックスと複合インデックスの貼り方について

oikake

総合スコア15

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2020/04/10 06:49

編集2020/04/10 06:57
# テーブル構造 user_item: { user_id:int(11), item_id:int(11), count:int(11), }

上記のようなテーブル構造で、

  • user_id 単体で検索することがある
  • item_id 単体で検索することはほとんどない
  • count 単体で検索することはない
  • user_id と item_id で検索することがある
  • レコードは user_id と item_id の組み合わせでユニークである
  • idの種類の数は user_id > item_id

といった想定の運用をする場合、インデックスの貼り方としては

  • A:user_id
  • B:usre_id,item_id
  • C:uniq(user_id,item_id)
  • D:uniq(item_id,user_id)
  • E:user_id, uniq(user_id,item_id)
  • F:user_id, uniq(item_id,user_id)

 ※uniq() はユニークな複合インデックスを表しています。

といった構成が予想されるかと思いますがどれが一番良いのでしょうか。

 
個人的な見解としては

  • 速度を求めるなら「F」
  • 堅牢性を求めるなら「C」
  • DBの容量を考慮するなら「A」

かなと考えており、B、D、E、にはメリットはないのかな想定しています。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

本質的にはprimaryをauto_incrementかなにかで1カラムつくっておくとよいでしょう
その上で「user_id と item_id の組み合わせでユニーク」のなので複合unique
をつけておけば基本的には問題ないです
ただしcountが集計しないのに浮いている感じがしますが

投稿2020/04/10 08:02

yambejp

総合スコア114905

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

インデックスはカーディナリティの低いものから並べた方が、単独の項目の検索と兼用して使用されることになるので効率的です。

user_id > item_id

上記が集合的にという事なら、Dでしょう。但し、user_idでの検索の場合は必ず2項目での検索です。
別な集合で単なるパターン数という事なら、Fです。

但しuniqe制約があるならuniqeインデックスですけど、制約が不要なら検索性能には影響しませんので敢えて指定する必要はありません。

※不要なのに使用する場合には、追加・更新時には制約の為のオーバーヘッドが生じます。

投稿2020/04/10 07:11

編集2020/04/10 07:32
sazi

総合スコア25206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oikake

2020/04/10 09:57

>カーディナリティの低いものから並べた方が、単独の項目の検索と兼用して使用されることになるので効率的 これは初耳でした。 そのようなのがあるのですね。。。 お教えくださりありがとうございます。
guest

0

ベストアンサー

まず、「ユニークになる組み合わせにUNIQUEインデックスを貼らない」という選択肢は除外していいでしょう。

そして、MySQLの場合、UNIQUE(col_a, col_b)というインデックスはcol_aの検索インデックスとしても使えますので、Eはuser_idのインデックスが全くの無駄です。

投稿2020/04/10 06:52

maisumakun

総合スコア145201

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oikake

2020/04/10 11:20

>「ユニークになる組み合わせにUNIQUEインデックスを貼らない」という選択肢は除外していいでしょう。 やはり基本的にそのようなパターンは良くないのですね。。。 >SQLの場合、UNIQUE(col_a, col_b)というインデックスはcol_aの検索インデックスとしても使えますので、Eはuser_idのインデックスが全くの無駄です なるほど、やはりEの構成は意味がないのですね。このあたりあやふやな認識だったので確証が得られてよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問