如何选择普通索引和唯一索引?|CSDN博文精选

作者 | .NY&XX
责编 | 郭芮
出品 | CSDN博客
select name from suser where id_card = ‘xxxxxxxxxxx’;
所以一般会考虑在id_card 字段上建索引。由于身份证号字段比较大,不适合用来作主键,索引现在有两个选择,要么给id_card字段创建唯一索引,要么创建一个普通索引。如果业务代码已经保证了不会写入重复的身份证号,那么这两个选择逻辑上都是正确的。但是要从性能角度上来考虑,选择的依据应该是什么呢?下面我们就从两种索引对查询过程和更新过程的性能影响来分析。

select id from t where a=3
这个查询语句在索引树上查找的过程将如下:
先是通过B+树从树根开始,按层序遍历的方式搜索到叶子节点,从而定位数据页。
通过二分查找来定位记录。
唯一索引而言,查找到满足条件的第一个条目(比如 (3,300))后就会停止继续检索。普通索引查找到一个满足条件的条目后将会继续查找,直到碰到第一个不满足a=3条件的条目。



访问这个数据页;
master thread线程每秒或每10秒进行一次merge insert buffer的操作;
在数据库正常关闭的时候。
此外,虽然名字叫做change buffer,但实际上它是可以持久化的数据,也就说它在内存中有拷贝,也会被写入到磁盘上。


seg size 为插入缓冲区的总大小(页的数量X16KB);
merges表示已经合并的merge的数量;
merged operations: insert 插入记录被merge的次数;
delete mark 删除操作被merge的次数;
delete 更新操作被merge了多少次。




对于唯一索引,找到2和4的位置,判断没有冲突后,插入这个值,执行结束
对于普通索引,找到2和4的位置,插入这个值,执行结束
如果这个条目要更新的数据页不在内存中:
对于唯一索引,需要将数据页读入内存,然后判断有没有冲突,然后进行插入。
对于普通索引,只需要将条目更新操作记录在change buffer就执行结束了。


如果a1 所在的Page1 在内存中,则直接更新内存;
如果a2 所在的Page2 没有在内存中,则在change buffer中记录下“要往 Page2 插入一行”这个信息;
将更新Page1这个动作记入到redo log 中;
将change buffer记录插入信息这个动作记入到redo log中。
第3、4写redo log的两次操作合在一起写磁盘。所以从执行过程中可以发现, 执行这条更新语句的成本很低,只写了两处内存,而且还是顺序写的。图中的两个红色箭头,都是后台操作(空闲时或者必须时写入磁盘),不影响更新的响应时间。



关注公众号:拾黑(shiheibook)了解更多
[广告]赞助链接:
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

随时掌握互联网精彩
- 1 跟着总书记探寻文明之光 7904636
- 2 中方回应朝鲜确认向俄罗斯派兵 7808694
- 3 新娘因长相太美被质疑AI换脸 7713939
- 4 关税冲击如何应对 7617039
- 5 今年首个“蛇年蛇月蛇日蛇时”来了 7520321
- 6 曹骏 内娱寻亲第一人 7425048
- 7 外交部回应李嘉诚卖港口:望审慎行事 7333423
- 8 太原现“晋A好几个8”车牌 交警调查 7233252
- 9 郭晶晶夫妇现身李兆基丧礼 7135604
- 10 夫妻俩因为孩子丢失 35年几乎不说话 7040397