当前位置: 首页 > 面试题库 >

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

尉迟雅昶
2023-03-14
问题内容

我应该在列上 定义一个单独的索引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_EMAILhtml" target="_blank">添加到表中时,相同的查询显示:

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能使用复合指数的最左边的部分。在某些边界情况下,索引的大小可能会使查询变慢,但是在真正遇到它们之前,您不必担心它们。

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



 类似资料:
  • SQL UNIQUE 约束 UNIQUE 约束唯一标识数据库表中的每条记录。 UNIQUE 和 PRIMARY KEY 约束均为列或列集合提供了唯一性的保证。 PRIMARY KEY 约束拥有自动定义的 UNIQUE 约束。 请注意,每个表可以有多个 UNIQUE 约束,但是每个表只能有一个 PRIMARY KEY 约束。 CREATE TABLE 时的 SQL UNIQUE 约束 下面的 SQL

  • 我试图在两个表之间创建一个外键约束,但在执行alter命令之后,mysql创建了索引而不是外键。 我使用的是hibernate,所以最初我认为这是hibernate的问题,但当我直接在mysql上执行查询时,行为是一样的。 更改表person添加约束FK9ircw28d19mdg5pu8yfg1qs8p外键(Address_Id)引用地址(Address_Id) 运行此命令后,我会在mysql数据

  • Liquibase文件如下: 数据库更改日志: 我在启动spring boot应用程序时添加唯一约束时遇到以下错误 迁移更改集失败 /db/changelog/changes/1.create-account-balance-table.yml::1::roran:原因:liquibase.exception.数据库异常: ERROR:语法错误在或接近PARTITION位置: 93[失败SQL:(

  • 问题内容: 在Oracle 10g中,如何在两个varchar字段上添加唯一的不区分大小写的约束?例如,给定表中已存在以下记录: 以下插入内容将无效: 但是以下插入内容将是有效的: 问题答案: 假设您的表名为 person ,名字和姓氏列称为 first_name 和 last_name ,请添加以下唯一约束: 让我知道我是否正确理解了您的问题,并对表布局做出了正确的假设。

  • 问题内容: 这是我的模型: 每个书的编号从每位作者的1开始并向上递增。因此,我们将有John Grisham撰写的1,2,3本书,George Martin撰写的1..5本书,等等。 我是否可以设置一个唯一的约束条件,以确保我们不会有两本书的作者相同?与相似,但约束仅适用于?的复合 问题答案: 用途:

  • 问题内容: 我有一张表,像 该对(FieldID,FormID)应该是唯一的,但只有在不删除该行(isDeleted = 0)的情况下,才可以。 是否可以在SQLServer 2008中定义这样的约束?(不使用触发器) PS设置(FieldID,FormID,isDeleted)是唯一的,增加了将一行标记为已删除的可能性,但是我希望有机会将n行(每个FieldID,FormID)设置为isDele