索引 - 唯一索引

  • 作者:KK

  • 发表日期:2017.4.10


介绍

唯一索引就“在这一列上建立的索引,每个被索引的值都是唯一、不重复的

比如用户表有age字段存年龄,那要建立索引的时候,若出现2个用户都是10岁那就无法为这个age列建立唯一索引

MySQL通过唯一索引查找数据时,假设WHERE order_id = 1552的话,在索引里一旦找到了1552就不会再扫描索引了,马上退出索引查找过程去读数据

因为唯一索引的特性已经告诉了MySQL:“行了行了,整个索引里就只有我是这个值,找到了就不用再去别的地方找了

由于值不重复,那查找的速度比普通索引还要快咯

而同时其实主键索引也是带有唯一特性的


通过实践了解唯一特性

#创建一张用户表,有一个mother_id关联一个妈妈
CREATE TABLE user(
	id INT NOT NULL AUTO_INCREMENT,
	mother_id INT NOT NULL,
	PRIMARY KEY(id)
);


#查看索引:只有主键索引
SHOW INDEX FROM user\G;


#添加索引
ALTER TABLE user ADD UNIQUE(mother_id);


#查看索引:多了个Key_name: mother_id的索引,并且Non_unique: 0就是索引唯一的特征
SHOW INDEX FROM user\G;


#插入1条数据先
INSERT INTO user(mother_id) VALUES(111);


#再执行一次相同的数据插入语句,结果报错“Duplicate entry '111' for key 'mother_id'”,因为mother_id建了唯一索引,不允许插入重复值
INSERT INTO user(mother_id) VALUES(111);


#删除mother_id这个索引
ALTER TABLE user DROP INDEX mother_id;


#再插入相同数据,结果成功
INSERT INTO user(mother_id) VALUES(111);


#对mother_id建立普通索引
ALTER TABLE user ADD INDEX mother_id(mother_id);


#再插入相同数据,依然成功
INSERT INTO user(mother_id) VALUES(111);

常用场合

虽然说值唯一的时候适合建唯一索引,但通常又是哪些业务场景会这样呢

  1. A表跟B表是一对一关系,则关联字段如果经常用于查询就建立唯一索引

    通常在按业务模块进行垂直分表之后会有这样的关系

  2. 剩下就是跟别的表基本没啥关系甚至没关系,但值又唯一,要列入查询条件里的,这种情况很少