mysql唯一索引和unique
2016-05-28 19:10
489 查看
最近遇到一个问题:高并发环境下,如何避免一张表里的某些列不要重复。
我这样回答的(被“高并发”给骗了,傻傻地往复杂里想):
1. 查找和插入这两个操作做成一个事务,对整张表加锁。。。是不是很low的想法?
2. 那就允许临时的不一致性,不管三七二十一,随便插,在查询、修改、删除的时候将多余的行删掉就好了,即保证最终一致性即可。。。好像效率高了一点,但是好麻烦啊。。。
面试官跟我说,知不知道“唯一索引”,突然间就蒙了(⊙o⊙)…
其实就是unique啦,这也从侧面表现出自己这方面的基础不够扎实,居然没有第一时间想到最简单的做法,sql标准本身就是支持这样一个需求的!
也可以在建表后增加或删除索引:
测试unique的作用:
测试动态修改唯一索引:
1. 删除
2. 增加
注意看里面的”possible_keys”这一列,它是用了”PRIMARY”这一个索引来查找的!
参考:http://blog.csdn.net/haifu_xu/article/details/16864933
而唯一索引可以对多个列都做,并且它是可以为空的,它虽然叫做索引,但是它主要是用来防止某些列的重复的,而不是专门用来查找的,所以和普通的索引的效率差别????(等我知道了再解释~)
最后附上这次实验的代码:
我这样回答的(被“高并发”给骗了,傻傻地往复杂里想):
1. 查找和插入这两个操作做成一个事务,对整张表加锁。。。是不是很low的想法?
2. 那就允许临时的不一致性,不管三七二十一,随便插,在查询、修改、删除的时候将多余的行删掉就好了,即保证最终一致性即可。。。好像效率高了一点,但是好麻烦啊。。。
面试官跟我说,知不知道“唯一索引”,突然间就蒙了(⊙o⊙)…
其实就是unique啦,这也从侧面表现出自己这方面的基础不够扎实,居然没有第一时间想到最简单的做法,sql标准本身就是支持这样一个需求的!
具体怎么做呢?
可以在声明表的时候就加入这样一个约束(下面是mysql的语法):create table Test ( id INT NOT NULL, name VARCHAR(30) unique, phoneNumber VARCHAR(20), password VARCHAR(32), primary key(id), unique key pn (phoneNumber) );
也可以在建表后增加或删除索引:
CREATE UNIQUE INDEX pw on Test(password); ALTER TABLE Test DROP INDEX pn;
试一下
首先建表:测试unique的作用:
测试动态修改唯一索引:
1. 删除
2. 增加
primary key和唯一索引的区别
有人说主键是特殊的索引,只不过它不允许为空,并且在一张表里只能声明一组列为主键,主键可以被外键引用,mysql等数据库一般都自动给主键列建立索引来优化查询,比如使用explain来看一下:注意看里面的”possible_keys”这一列,它是用了”PRIMARY”这一个索引来查找的!
参考:http://blog.csdn.net/haifu_xu/article/details/16864933
而唯一索引可以对多个列都做,并且它是可以为空的,它虽然叫做索引,但是它主要是用来防止某些列的重复的,而不是专门用来查找的,所以和普通的索引的效率差别????(等我知道了再解释~)
最后附上这次实验的代码:
// 建表
create table Test ( id INT NOT NULL, name VARCHAR(30) unique, phoneNumber VARCHAR(20), password VARCHAR(32), primary key(id), unique key pn (phoneNumber) );
// 测试建表方法的unique效果
insert into Test values(1, 'name', '123456', 'psw');
insert into Test values(2, 'name', '654321', 'psw2');
// 测试动态修改方法的unique效果
ALTER TABLE Test DROP INDEX name;
insert into Test values(2, 'name', '654321', 'psw2');
select * from Test;
insert into Test values(3, 'name', '654321', 'psw2');
// 测试动态修改方法的unique效果
select * from Test;
CREATE UNIQUE INDEX `psw` on Test(password);
insert into Test values(3, 'name', '233', 'psw2');
// 查询mysql执行按主键select时的表现
explain select * from Test where id=1;
相关文章推荐
- 链式队列(Linked Queue)
- 项目的build path的几个选型卡都是以什么意思?1Source 2Projects 3Libraries 4Order and Export
- CDH HUE配置自定义MySql数据库
- UIKit视图动画的微扩展
- UIKit视图动画的微扩展
- UIKit视图动画的微扩展
- 循环队列(Circular Queue)
- deque容器
- iOS中UITextField使用详解
- HDU-5297-Y sequence(容斥+迭代)
- 2016 UESTC Training Search Algorithm and StringB - Xiper的奇妙历险(2)(三维迷宫)
- (Leetcode 95+96)Unique Binary Search Trees 动态规划 分治
- HDU 4010 Query on The Trees(动态树)
- 对Map按key和value分别排序
- [leetcode]347. Top K Frequent Elements
- It is indirectly referenced from required .class files
- UIButtonAndNSTimer
- ora-00054:resource busy and acquire with nowait specified
- Hibernate中的query.setFirstResult(),query.setMaxResults();
- ORA-00054: resource busy and acquire with NOWAIT specified