したほうがいい別のインデックスを定義する列に(検索目的で)インデックスを追加するか、制約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;
編集: 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
ベストアンサー1
あユニークキーはインデックスの特殊なケースであり、一意性のチェックが追加された通常のインデックスのように動作します。を使用すると、SHOW INDEXES FROM customer
一意のキーが実際には B ツリー タイプのインデックスであることがわかります。
あ複合インデックスで(email, user_id)
十分です。電子メールのみに別のインデックスは必要ありません。MySQL は複合インデックスの左端の部分を使用できます。インデックスのサイズによってクエリの速度が低下する可能性がある境界ケースがいくつかありますが、実際に遭遇するまでは心配する必要はありません。
インデックスの使用をテストするには、まずテーブルにいくつかのデータを入力して、そのインデックスを使用する価値があるとオプティマイザーに判断させる必要があります。