MySQL---普通索引VS唯一索引

普通索引和唯一索引

普通索引是为了加快访问速度为某个字段建立的索引,被索引的数据列允许有重复的值。

唯一索引和普通索引类似,但是被索引的数据列不允许包含重复的值。

两者如何选择?

1.查询过程

SQLselect * from student where id = 1001;

对于普通索引来说,查找到满足条件的第一个记录后,需要查找下一个记录,直到碰到第一个不满足条件的记录为止。

对于唯一索引来说,由于索引定义了唯一性,查找到第一个满足条件的记录后,就会停止继续检索。

但是InnoDB的数据是按数据页为单位来读写的。也就是说当需要读一条记录的时候,并不是将这个记录本身从磁盘读出来,而是以页为单位,将其整体读入内存。在InnoDB中,每个数据页的大小默认是16KB,所以这个影响是很小的。

2.更新过程

关键者 change buffer

当需要更新一个数据页时,如果数据页在内存中就直接更新,而如果这个数据页还没有在内存中的话,在不影响数据一致性的前提下,InooDB会将这些更新操作缓存在change buffer中,这样就不需要从磁盘中读入这个数据页了。在下次查询需要访问这个数据页的时候,将数据页读入内存,然后执行change buffer中与这个页有关的操作。通过这种方式就能保证这个数据逻辑的正确性。

change buffer 是可以持久化的数据,是会被写到磁盘里的。

change buffer用的是buffer pool里的内存,因此不能无限增大。change buffer的大小,可以通过参innodb_change_buffer_max_size来动态设置。这个参数设置为50的时候,表示change buffer的大小最多只能占用buffer pool的50%。

InnoDB更新流程:

更新目标页在内存中:
对于唯一索引来说,找到要插入的位置,判断有没有冲突,插入这个值,语句执行结束;
对于普通索引来说,找到要插入的位置,插入这个值,语句执行结束。

更新目标页不在内存中:
对于唯一索引来说,需要将数据页读入内存,判断到没有冲突,插入这个值,语句执行结束;
对于普通索引来说,则是将更新记录在change buffer,语句执行就结束了。

通过分析,change buffer只限于用在普通索引的场景下,而不适用于唯一索引。

因此对于写多读少的业务来说,页面在写完以后马上被访问到的概率比较小,此时change buffer的使用效果最好。但是相反的是如果插入数据后马上伴随着对这个记录的查询,那么你应该关闭change buffer。

总结:

如果业务可以在唯一索引和普通索引做选择,由于唯一索引用不上change buffer的优化机制,从性能角度出发优先考虑普通索引。

猜你喜欢

转载自blog.csdn.net/MAKEJAVAMAN/article/details/118441039