唯一索引和普通索引的选择和区别

问题前要:对于一个字段,它的更新操作很频繁,那么应该使用普通索引还是唯一索引?
结论:
如果业务能够保证唯一性应该尽量选择普通索引而不是唯一索引
从查询和更新两方面说明:



查询:



查询来说二者的区别是
普通索引查到符合条件的项后会继续查找下一项,如果下一项不符合再返回
唯一索引则是查到符合条件的项后就直接返回
其实这两种方式效率几乎没有差别,因为查找都是先读取数据项然后在内存中进行的所以多读取一次并不会带来很大的影响
更新:
对于更新操作二者还是有很大区别的,要理解他们之间的区别首先要理解change buffer
change buffer是用来记录更新操作的一种行为,在没有把数据项从硬盘读取到内存中时,进行更新操作会先将操作记录的change buffer中
在下一次进行select的时候在把数据项读取到内存中时,会对数据项执行change buffer中的命令,这个过程也成为merge
所以唯一索引的更新操作往往是这样,首先判断要插入的项在数据库中存不存在,这里就涉及到了一个读的问题,往往这个时候就会把数据从硬盘读取到内存中,如果这个时候还使用change buffer的意义并不大
因为change buffer存在的意义就是减少磁盘于内存的IO,现在数据项已经在内存中了,可以直接修改,所以唯一索引是不适用change buffer的
普通索引的更新操作
普通索引往往是将操作记录到change buffer中,在下一次读取的时候执行这些操作,可以显著减少磁盘与内存的IO操作,从而提高效率



选择:
如果是读取远大于更新和插入的表,唯一索引和普通索引都可以,但是如果业务需求相反,个人觉得应该使用普通索引,当然如果是那种更新完要求立即可见的需求,就是刚更新完就要再查询的,这种情况下反而不推荐普通索引,因为这样会频繁的产生merge操作,起不到change buffer的作用,反而需要额外空间来维护change buffer就有点得不偿失了


Category storage