Mysql-普通索引和惟一索引

普通索引

image.png

普通索引页记录的是普通索引以及主键值,故查询非主键字段的时候,须要回表.数据库

普通索引数据页内部经过二分法来定位记录.缓存

普通索引在查询时须要额外多查询一次下一条记录,而惟一索引查到则不会继续往下查spa

change buffer

change buffer在内存中有拷贝,也会被写入磁盘
在更新数据时,若是数据直接在内存中就直接写入内存,若是不在内存中须要从磁盘中读取这个数据页,下次查询须要访问这个数据页时,先读入数据页,再执行changebuffer中的相关页操做即merge操做线程

何时触发merge?日志

  • 访问这个数据页
  • 后台线程会按期 merge
  • 数据库正常关闭

什么条件下使用change buffer?
惟一索引在执行更新操做时须要判断是否违反惟一性约束,必须先读取数据,因此惟一索引没法使用change buffer
因此只有普通索引才可使用索引

change buffer多少大小?
change buffer 用的是 buffer pool 里的内存,经过参数 innodb_change_buffer_max_size来设置,当值为50时,表示最多只占用buffer pool 的 50%,设置为0时,表示关闭change buffer内存

何时使用change buffer呢?
merge 的时候是真正进行数据更新的时刻,而 change buffer 的主要目的就是将记录的变动动做缓存下来,因此在一个数据页作 merge 以前,change buffer 记录的变动越多(也就是这个页面上要更新的次数越多),收益就越大。
对于写多读少的业务,页面在写完后不会被立马访问到时使用效果最好,如帐单类、日志类的系统
change buffer 对于机械硬盘,效果很是显著,当相似历史数据的库,应尽可能使用普通索引,而后把change buffer尽可能开大.it

redo log和change buffer的区别innodb

image.png

  1. page1在内存中,直接更新内存;
  2. page2不在内存,就在这change buffer 区域记录下“我要往 Page 2 插入一行”这个信息
  3. 将上述两个动做记入 redo log 中(图中 3 和 4)
  4. 虚线箭头为后台执行操做,不影响更新时间

综上所述,整个过程仅顺序写了两处内存,写了一处磁盘
redo log主要节省的是随机写磁盘的IO消耗,而change buffer主要节省的是随机读磁盘的消耗class

相关文章
相关标签/搜索