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

o2gm4chl  于 2024-01-05  发布在  Mysql
关注(0)|答案(2)|浏览(152)

我应该在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

wj8zmpe1

wj8zmpe11#

  • unique key* 是索引的一种特殊情况,就像一个普通的索引,增加了唯一性检查。使用SHOW INDEXES FROM customer你可以看到你的unique key实际上是B树类型的索引。

(email, user_id)上的 * 复合索引 * 就足够了,你不需要只在电子邮件上使用单独的索引- MySQL可以使用复合索引的最左边部分。可能会有一些边界情况,索引的大小会减慢你的查询速度,但你不应该担心它们,直到你真正遇到它们。
至于测试索引的使用情况,你应该首先用一些数据填充你的表,让优化器认为它实际上值得使用该索引。

ui7jx7zq

ui7jx7zq2#

除了上面的答案之外,还可以使用HASH键创建一个唯一的索引,在这种情况下,优化器将无法使用它来查找行。https://mariadb.com/kb/en/getting-started-with-indexes/#unique-index

相关问题