唯一索引和普通索引的使用上要注意什么

考虑下面一种情况:

select name from CUser where id_card = 'xxxxxxxyyyyyyzzzzz';

你可能会将id_card作为主键了,但最好别这么做。你想想这么长一串的字符串做主键,查询时候效率其实是比较低的,其实是建议选择其他的作为主键。
那么我们很可能查的时候还是要按照身份证查的啊!所以在身份证上做个索引是应该的。那么用唯一索引还是普通索引?其实这里业务逻辑已经保证了身份证号唯一,所以唯一索引和普通索引在逻辑上都是对的。
那么到底挑哪个呢?其实这种时候我们建议是用普通索引,原因如下:

查询

假设,执行查询的语句是 select id from T where k=5
其实在查询这一点上,二者差距不大。因为唯一索引查到了就完事了,普通索引则是查到了还要继续直到查到第一个不符合的。因为页是基本读写单位,所以基本上一次都能读进来k=5,所以查询二者差不多

更新

这一点是值得说的,二者的差异主要在change buffer上,这是一个缓解反复磁盘写入io的插件。
假设要更新数据页A,但A现在不在内存里,就先不从磁盘读,而是先把更新操作缓存在change buffer里,等到下次需要查询访问A时,A自然会加载进内存,这时候再把change buffer里的缓存过的更新操作给执行了。把change buffer的数据写到数据页上这个操作叫merge,除了刚才说的,后台线程也会定期自动merge,数据库关闭时候也会merge。
上面说的change buffer虽然是好,但是唯一索引却用不了,也就是说实际上只有普通索引才能用。为啥呢?因为唯一索引需要判定我当前写入的数据合理不,也就是说得判定唯一性,那得把页A读进内存才能比较呀,所以change buffer实际上它用不到。

建议

所以建议,尽量使用普通索引啊!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值