在mysql数据库的设计和使用过程中,唯一索引是保证数据唯一性的重要手段,很多开发者在设计表结构时都会疑惑,一个mysql表到底可以创建多少个唯一索引。

mysql单表唯一索引的数量限制
mysql中一个表可以创建的唯一索引数量,和表的存储引擎以及mysql的版本有关,目前主流的存储引擎是InnoDB,在InnoDB引擎下,单表最多可以创建64个二级索引,其中就包含唯一索引,也就是说一个InnoDB表最多可以创建64个唯一索引。如果是MyISAM存储引擎,单表最多可以创建64个索引,其中唯一索引的数量同样受这个总索引数限制。
需要注意的是,这个限制是二级索引的总数,如果你创建了主键索引,主键索引不占用这64个索引的名额,因为主键索引是聚簇索引,和二级索引的存储结构不同。
唯一索引的创建方式
我们可以在创建表的时候直接添加唯一索引,也可以在表创建完成后通过修改表结构的方式添加唯一索引,以下是两种常见的创建方式示例。
创建表时添加唯一索引
-- 创建用户表,给用户名和邮箱分别添加唯一索引 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) NOT NULL, `email` varchar(100) NOT NULL, `age` int(11) DEFAULT NULL, PRIMARY KEY (`id`), UNIQUE KEY `uk_username` (`username`), UNIQUE KEY `uk_email` (`email`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
表创建后添加唯一索引
-- 给已有的user表的age列添加唯一索引 ALTER TABLE `user` ADD UNIQUE KEY `uk_age` (`age`); -- 也可以使用CREATE UNIQUE INDEX语句添加 CREATE UNIQUE INDEX `uk_age` ON `user` (`age`);
唯一索引的使用注意事项
- 唯一索引允许列值为NULL,但是多个NULL值不会违反唯一约束,因为NULL不等于任何值,包括NULL本身,如果你需要完全不允许重复,包括NULL,可以设置列属性为NOT NULL再添加唯一索引。
- 唯一索引可以是单列索引,也可以是多列组合的唯一索引,多列组合的唯一索引要求组合的值不重复,单个列的值可以重复。
- 虽然mysql允许创建最多64个唯一索引,但是实际业务中不建议创建过多索引,因为每个索引都会占用额外的存储空间,并且在插入、更新、删除数据的时候,需要同时维护所有索引,会影响写操作的性能。
- 唯一索引和普通索引的区别在于唯一索引会校验数据的唯一性,在查询性能上,两者没有太大差异,因为都是通过索引树快速定位数据。
如何查看表的唯一索引信息
我们可以通过SHOW INDEX语句查看表的索引信息,其中Non_unique字段为0的就是唯一索引。
-- 查看user表的所有索引信息 SHOW INDEX FROM `user`;
执行上述语句后,结果中Key_name是索引名称,Non_unique为0的对应索引就是唯一索引,我们可以据此确认当前表的唯一索引数量和具体配置。