UNIQUE 约束是否自动在字段上创建 INDEX?

我应该在 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
53205 次浏览

独一无二的钥匙是索引的一种特殊情况,类似于常规索引,增加了惟一性检查。使用 SHOW INDEXES FROM customer,您可以看到您的唯一键实际上是 B 树类型的索引。

一个 (email, user_id)上的 综合指数就足够了,你不需要一个单独的索引电子邮件只-MySQL 可以使用一个复合索引的最左边的部分。在某些边界情况下,索引的大小可能会降低查询的速度,但是在实际遇到它们之前,您不应该担心它们。

至于测试索引的使用,您应该首先在表中填充一些数据,以使优化器认为使用该索引实际上是值得的。