唯一索引和普通索引的区别
查询过程
基本没有区别
select id from T where k = 5
InnoDB 数据的读写单位是数据页,默认是 16KB。
更新过程
普通索引可以使用 change buffer(会持久化),唯一索引不行。
当需要更新一个数据页是,如果数据页在内存中就直接更新,
如果数据页还没在内存中,在不影响一致性的前提下,InnoDB 会将更新缓存在 change buffer 中,这样就不需要从磁盘读取数据页了。
除了访问数据页会触发 merge 外,系统后台线程会定期 merge,数据库正常关闭也会执行 merge。(merge 时同数据页更新越频繁,收益越大)
change buffer 用的是 buffer pool 的内存,可以通过参数 innodb_change_buffer_max_size
动态数组 change buffer 占用百分比。
change buffer 适用场景
- 写多读少,change buffer 不适合数据更新后立即被访问的场景(多了 merge 的代价)
- 数据页被更新越频繁,收益越大
索引选择实践
- 对于一般场景,应该优先选择唯一索引,以保证数据准确性
- 对于频繁更新/插入场景,可以选择普通索引,通过 change buffer 提升性能
- 对于频繁更新后立即查询的场景,可以选择关闭 change buffer
- 对于归档数据,因为已经保证数据准确性,所以可以选择普通索引