当前位置: 首页 > Web前端 > HTML

ChangeBuffer只适用于非唯一索引页?错

时间:2023-03-28 00:53:26 HTML

最近在网上看到一些文章说:“changebufferisonlyapplicabletonon-uniqueindexpages”。//dev.mysql.com/doc/ref...changebuffer是一种特殊的数据结构,当这些页面不在缓冲池中时,它会缓存对二级索引页面的更改。这意味着,缓存那些不在缓冲池中的二级索引页,不引用非唯一二级索引。使用changebuffer的具体条件是什么?其实具体的使用情况主要集中在以下五点:用户设置选项innodb_change_buffering。在mysql的索引结构中,只有叶子节点存储数据。所以,只有当有叶子节点的时候,我们才考虑是否使用ibuf。如上文档所示,changebuffer只能缓存二级索引页,所以对于聚簇索引,不能进行缓存操作。聚簇索引页由Innodb引擎加载到BufferPool中(这个搜索过程是顺序I/O),然后插入、更新和删除数据记录。因为唯一二级索引(uniquekey)的索引记录是唯一的,insert和update操作不能缓存,delete操作可以缓存;没有对表进行flush操作,比如执行flushtableforexport时,该表是不允许ibuf缓存的(通过dict_table_t::quiesce标识)下面我们结合源码??和文档来看看具体操作。源码地址:GitHub-mysql/mysql-server:MySQLServer,全球最流行的开源数据库,MySQL先看第一点设置选项tailinnodb_change_buffering,可以进行INSERT、DELETE-MARK三种操作,DELETECache,对应的三个dml语句的关系如下:INSERT操作:插入二级索引。先进行DELETE-MARK操作,再进行INSERT操作:更新二级索引。DELETE-MARK操作:删除二级索引//代码路径:storage/innobase/include/ibuf0ibuf.h/*可能的操作缓冲在插入/任何缓冲区中。参见ibuf_insert()。不要更改这些值,它们存储在磁盘上。*/typedefenum{IBUF_OP_INSERT=0,IBUF_OP_DELETE_MARK=1,IBUF_OP_DELETE=2,/*不同操作类型的数量。*/IBUF_OP_COUNT=3}ibuf_op_t;/**可以缓冲的操作组合_ange_inno*/enumibuf_use_t{IBUF_USE_NONE=0,IBUF_USE_INSERT,/*insert*/IBUF_USE_DELETE_MARK,/*delete*/IBUF_USE_INSERT_DELETE_MARK,/*insert+delete*/IBUF_USE_DELETE,/*delete++purgeUS*/E_ERTAL_/};另外,innodb_change_buffering也可以通过设置其他选项来进行相应的缓存操作:all:默认值,bufferinserts,delete-marking操作,purges默认开启。none:不启用更改缓冲区。inserts:只启用缓冲区插入操作。删除:只启用删除标记操作。更改:启用缓冲区插入操作和删除标记操作。purges:为仅在后台执行的物理删除操作启用缓冲功能。第二点还是需要大家自己判断条件,就不展开解释了。下面详细说说第三点。第三点的具体参考函数是ibuf_should_try。满足ibuf缓存条件后,它会采用两种方式尝试获取数据页。这里说明一下,在MySQL5.5之前的版本中,因为只支持缓存的insert操作,所以最初叫insertbuffer,后来的版本支持更多的操作类型缓存,所以叫changebuffer,只是代码和Changebuffer不同-相关的函数或变量仍然以ibuf前缀开头。下面是函数的具体实现,地址在:storage/innobase/include/ibuf0ibuf.ic/**一个基本的部分测试是否可以插入到插入缓冲区并被推荐。*/staticinlineiboolibuf_should_try(dict_index_t*index,/*!max_size!=0&&index->??space!=dict_sys_t::s_dict_space_id&&!index->??is_clustered()&&!dict_index_is_spatial(index)&&!dict_index_has_desc(index)&&index->table->quiesce==QUIESCE_NONE&&(ignore_sec_unique||!dict_index_is_unique(index))&&srv_force_recovery