索引 - 唯一索引 ¶
本文导航
作者: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);
常用场合 ¶
虽然说值唯一的时候适合建唯一索引,但通常又是哪些业务场景会这样呢
A表跟B表是一对一关系,则关联字段如果经常用于查询就建立唯一索引
通常在按业务模块进行垂直分表之后会有这样的关系
剩下就是跟别的表基本没啥关系甚至没关系,但值又唯一,要列入查询条件里的,这种情况很少