在看mysql45讲,收获颇丰。
1.问题引入
你现在已经知道了唯一索引的优势了,那就是每次插入的时候会帮助我们去查询一下是不是数据库中已经存在了这个值,如果存在就插入失败。普通索引可以插入重复的值。假设现在要统计市民的信息,身份证号已经保证了唯一。所以唯一索引的优势不存在了,那么普通索引就更优秀吗?
2. 性能比较
我们从select,update两方面说
3. 查询
- 唯一索引:B+树(默认了InnoDb引擎) ,InnoDb是以数据页为单位的,一个页大小默认是16k。唯一索引已经保证了数据库中该键值的唯一性,所以每次查询的时候,只要查到一个数据直接返回就ok。
- 普通索引:和唯一索引的区别是,他查找这个值v之后,并不马上返回,而是要查询一下下个叶子节点是不是也是v。如果要查询的值v是在数据页的最后一个位置,那就要再加载一个16k的数据页,再判断一次。(因为一个也的数据很多,所以这种情况是很少的)。另一种情况就是v不在数据页的最后一个位置,那就再判断v右边叶子节点的值是不是v就可以了。
- 总结:就查询来说唯一索引是更优秀的,但差距微乎其微!
4. 更新
- 唯一索引:更新的时候要先走一遍查询,看看值是不是已经出现了。如果没有出现就马上写到磁盘上。
- 普通索引:每次插入的时候直接插入。而且不是不直接对磁盘更新,而是在内存中有一个缓冲区(change buffer)。记录修改的数据。所以普通索引的插入还是很快的。如果写了之后要读,就要把change buffer的东西先写到内存然后再读。
5. 总结
- 唯一索引和普通索引 读是差不多的。所以如果是读少写多,普通索引更优秀,因为change buffer的存在。但是如果是每次写了之后都要都读,唯一索引更优秀一点点,因为唯一索引是直接往磁盘写,而普通索引是先写change buffer,再从change buffer往磁盘写。
- 所以就选普通索引!如果每次写了之后都要读,那就关闭change buffer。
6. 补充:change buffer和redo log
redolog主要是记录操作,可以恢复数据库。 而change buffer是提升效率。
网友评论