普通索引与唯一索引,应该怎么选择?读后总结

在业务代码已经保证了不会写入重复的字段,那么尽量使用普通索引

普通索引与唯一索引对比:
在查询过程
select id from t where k=5;从这条查询语句开始分析,分别分析k为普通索引时与唯一索引是的区别
普通索引:在查到满足条件的记录,还需要继续往下查找。这里就用到了之前说的假设,业务已经保证了不会写入重复字段,否则查询次数与重复记录成线性增长。但是若不重复的情况。也就比唯一索引多一次查询比较的操作。innodb数据是以内存页存储的。innodb的数据页默认大小16kb,数据读就读一个数据页。
唯一索引:查询到满足条件的记录直接返回。
对于查询来说 普通索引与唯一索引基本差不多。

比较大的差别是在更新过程中:(PS:尤其是写多读少的系统)

当需要更新一个数据页时,如果数据页在内存中就直接更新,如果这个数据页不在内存中,innodb会在不影响数据一致性的情况下,将更新操作缓存在change buffer中,这样就不需要从磁盘中读入这个数据页。下次访问这个数据页时候,从磁盘将数据页读入内存,从change buffer 中拿到这个数据页是更新操作。将这个页更新成脏页。changebuffer也是会被持久化的。将change buffer 应用到数据页上的操作称为merge,除了当访问这个数据页的时候,会merge,有后台线程定期merge。在数据库正常关闭也会merge。
change buffer减少了将数据页读入内存,mysql的内存是从buffer pool 分配的,从而避免占用内存,提高内存占用率。所以对于写入后立马会读的系统,change buffer并不会提高更新效率。

唯一索引不使用change buffer

在实际使用过程中,普通索引和change buffer的配合使用,对于数据量大的表的更新优化还是很明显的。

redo log WAL提升性能的核心机制是尽量减少了随机读写。将随机读写变为了顺序读写。
change buffer主要节省的是随机读磁盘的IO,在更新操作时不用从磁盘读书数据。

你可能感兴趣的:(Mysql)