小编典典

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

mysql

我应该在列上 定义一个单独的索引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;

编辑 :根据科宾的建议,我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

阅读 1517

收藏
2020-05-17

共1个答案

小编典典

一个 独特的关键 是指数的一个特例,像个与独特性增加检查的常规指标。使用SHOW INDEXES FROM customer您可以看到您的唯一键实际上是B树类型索引。

一个 综合指数(email, user_id)是不够的,你不需要只电子邮件单独的索引-
MySQL能使用复合指数的最左边的部分。在某些边界情况下,索引的大小可能会使查询变慢,但是在真正遇到它们之前,您不必担心它们。

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

2020-05-17