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

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

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

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

Q&A

解決済

3回答

3030閲覧

【MySQL】varchar型にindexを貼る際の注意などを知りたい

nnahito

総合スコア2004

MySQL

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

0グッド

1クリップ

投稿2019/05/13 07:23

環境

MySQL5.7

知りたいこと概要

  • MySQLで、varchar型(テキストを入れるカラム)にindexを貼るのはOKか?
  • 対象のカラムがメールアドレスである場合、indexは意味を成すのか?
  • どのような点に注意してindexを貼るべきなのか?

知りたいこと詳細

今回新しくテーブルを設計するにあたり、where句で使うのが主にメールアドレス(文字列)のカラムになってしましました。

uniqueにすればいいとは思うのですが、
退会→再登録
などのときに、unique制約だとエラーになってしまいます。

なので、できればindexを使いたいと考えているのですが、
メールアドレスは他と重複するものがありません。
なので、indexを貼ってもあまり意味がないように思えます。

なにか案がございましたら、ご教示いただけますと幸いです。
よろしくお願いいたします

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

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

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

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

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

guest

回答3

0

メールアドレスは他と重複するものがありません。

なので、indexを貼ってもあまり意味がないように思えます。

「他と重複するもの」とは他の項目と組み合わせた複合インデックスにはならないという意味ですか?
仮にそうであっても、メールアドレスはカーディナリティが高いものですから、効果はあるでしょう。

投稿2019/05/13 07:30

sazi

総合スコア25173

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

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

nnahito

2019/05/13 07:35

ご回答有り難うございます。 > メールアドレスはカーディナリティが高いものですから、効果はあるでしょう こちら私の完全なる理解間違いでした。 aaa@bbb.com bbb@aaa.com ccc@ccc.com だと、上から総なめでの検索になるような気がしていたのですが、 違うのですね…
sazi

2019/05/13 07:39 編集

インデックスで順序が担保されていることによって、総なめしなくて済むんです。 参考 II-22-1. インデックスの概念(http://ossforum.jp/book/export/html/1029)
guest

0

メールアドレスは他と重複するものがありません。

なので、indexを貼ってもあまり意味がないように思えます。

なぜそう思われたのでしょうか。

むしろ、他と重複する例が少ない列にこそ、インデックスは効力を発揮します(メールアドレスを完全一致で検索する場合など、まさにぴったりです)。逆に「男/女」のような「入る値が少なく、しかも均等に分かれている」ような場合、インデックスを使ってもあまり絞り込めない(カーディナリティが低い)ので、こちらのほうが役に立ちません。

投稿2019/05/13 07:27

maisumakun

総合スコア145183

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

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

nnahito

2019/05/13 07:33

ご回答有り難うございます! > むしろ、他と重複する例が少ない列にこそ、インデックスは効力を発揮します こちら私の理解間違いでした。 似たようなデータで索引を作っているイメージだったので、1件ずつ違ったデータが入っている場合はあまり効かないイメージだったのですが、違うのですね…
guest

0

ベストアンサー

重複するものがありません。

なので、indexを貼ってもあまり意味がないように思えます。

そんなことはないでしょう。
constにヒットしたときの効率はずば抜けたパフォーマンスになります

退会→再登録

などのときに、unique制約だとエラーになってしまいます。

退会フラグカラムをつくっておいて
メールアドレスと退会フラグの複数列に渡るuniqueインデックスにすると
ご希望にそうかもしれません。

投稿2019/05/13 07:27

yambejp

総合スコア114769

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

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

nnahito

2019/05/13 07:31

ご回答有り難うございます。 > そんなことはないでしょう。 > constにヒットしたときの効率はずば抜けたパフォーマンスになります こちら私の完全なる理解の間違いでした。 > 退会フラグカラムをつくっておいて > メールアドレスと退会フラグの複数列に渡るuniqueインデックスにする なるほど、確かにunique indexを複数まとめたカラムで設定するとできそうですね! ただ、2回目の退会ができなくなりそうですので、その辺考えないといけなさそう…
yambejp

2019/05/13 07:35 編集

> 2回目の退会ができなくなりそう これは運用の問題なので微妙です 複数回退会でき、それを保持したいのであれば、フラグをカウントアップすることでなんとかなるかも 前々回の退会情報を保持する必要がなければ0/1で処理すれば良いと思います(退会情報は上書き)
nnahito

2019/05/13 07:38

ご返信有難うございます。 > これは運用の問題なので微妙です なるほど…… > 複数回退会でき、それを保持したいのであれば、フラグをカウントアップすることでなんとかなるかも ふむ……頂いたご回答から、「メールアドレス」と「退会日時」でunique indexを貼ろうかと思っていたのですが… カウントアップのほうが良いのでしょうか?
yambejp

2019/05/13 07:41 編集

退会日時があるならフラグの代わりにつかえるでしょう (そもそも退会情報が拾えるならフラグ自体が不要になってくる) 当初はnullなのでしょうけど、nullは検索効率が悪いので 1970-01-01など過去日にしておくほうがよいかもしれません
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問