October 28, 2012

[MySQL 学习] Innodb Optimistic Insert流程

通常情况下,插入一条数据的接口函数为btr_cur_optimistic_insert,这时候不需要进行索引树分裂,先来看看这里怎么处理压缩表数据吧 btr_cur_optimistic_insert a. 计算该Page上还能写入的最大空闲空间大小 max_size = page_get_max_insert_size_after_reorganize(page, 1); 以及这条逻辑记录(dtuple_struct)转换成物理记录的大小 rec_size = rec_get_converted_size(index, entry, n_ext) b.判断该记录是否需要外部存储 if (page_zip_rec_needs_ext(rec_size, page_is_comp(page), 1320                    dtuple_get_n_fields(entry), zip_size)) 如果需要外部存储的话,返回DB_TOO_BIG_RECORD,由上层继续处理 当为压缩表时,在每个压缩Page上的dense page directory中为每条记录记录预留两个byte。但没有record header。在一个空的leaf page上,至少要有一条记录。另外还要减去一个Byte来存储heap number. 同样的该记录也不能大于非压缩page最大可用空间的一半 所以判断条件为:         (rec_size – (REC_N_NEW_EXTRA_BYTES – 2)               […]