1. ホーム
  2. mysql

[解決済み] UNIQUE 制約は自動的にフィールドに INDEX を作成しますか?

2022-09-18 23:53:50

質問

私は 別のインデックスを定義する の上に email カラムに別のインデックスを定義するか(検索のために)、またはインデックスが UNIQ_EMAIL_USER 制約とともに追加されるのでしょうか?

CREATE TABLE IF NOT EXISTS `customer` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  `first` varchar(255) NOT NULL,
  `last` varchar(255) NOT NULL,
  `slug` varchar(255) NOT NULL,
  `email` varchar(255) NOT NULL,
  `created_at` datetime NOT NULL,
  `updated_at` datetime NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `UNIQ_SLUG` (`slug`),
  UNIQUE KEY `UNIQ_EMAIL_USER` (`email`,`user_id`),
  KEY `IDX_USER` (`user_id`)
) ENGINE=InnoDB;

EDIT : Corbinの提案通り、私は EXPLAIN SELECT * FROM customer WHERE email = 'address' を空のテーブルに照会しました。これは結果です、私はそれをどのように解釈するかわかりません。

id select_type type possible_keys key  key_len ref  rows Extra
1  SIMPLE      ALL  NULL          NULL NULL    NULL 1    Using where

IXD_EMAILをテーブルに追加している間、同じクエリが表示されます。

id select_type type possible_keys key       key_len ref   rows Extra
1  SIMPLE      ref  IDX_EMAIL     IDX_EMAIL 257     const 1    Using where

どのように解決するのですか?

A 一意のキー はインデックスの特殊なケースで、一意性のチェックが追加された通常のインデックスのように動作します。使用方法 SHOW INDEXES FROM customer を使うと、一意なキーが実際にはB-treeタイプのインデックスであることがわかります。

A 複合インデックス (email, user_id) で十分であり、電子メールのみについて別のインデックスを作成する必要はありません。インデックスのサイズによってクエリが遅くなるようなボーダーケースもあるかもしれませんが、実際に遭遇するまで気にする必要はないでしょう。

インデックス使用のテストに関しては、オプティマイザが実際にそのインデックスを使用する価値があると考えるように、まずテーブルをいくつかのデータで満たす必要があります。