一个UNIQUE约束是否自动在字段上创build一个INDEX?

是否应该在email列上定义单独的索引 (用于search目的),还是索引是随“ 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; 

编辑 :由Corbinbuild议我查询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 

一个唯一的键是一个索引的特殊情况,就像常规索引一样,增加了对唯一性的检查。 使用SHOW INDEXES FROM customer您可以看到您的唯一键实际上是B型树索引。

(email,user_id)上的复合索引就足够了,你不需要在邮件上单独索引 – mysql可以使用复合索引的最左边部分。 可能会有一些边界情况,索引的大小会减慢查询的速度,但在实际运行之前,您不应该担心。

至于testing索引使用情况,您应该首先使用一些数据填充表,以使优化器认为使用该索引确实值得。