如何选择普通索引和唯一索引?|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 中央经济工作会议在北京举行 7904289
- 2 紧急提醒:请在日中国公民进行登记 7808969
- 3 中央定调明年继续“国补” 7712469
- 4 “九天”无人机成功首飞 7618784
- 5 断崖式降温!今冬最强寒潮来了 7522521
- 6 中央经济工作会议释信号:3件事不做 7427790
- 7 中国“空中航母”首飞成功 7330408
- 8 88岁爷爷机场接孙女几度认不出 7238575
- 9 人民空军中日双语发文:大惊小怪 7142957
- 10 寒潮来袭 “速冻”模式如何应对 7039260







CSDN
