June 1, 2013

Innodb Adaptive hash index 相关函数流程

这两天正在把Percona5.5的Multi AHI补丁port到5.6.11,顺便过了下AHI相关的代码逻辑,因此写的比较散乱,慎入!! 以下的分析基于5.6.11原版,主要包括AHI的存储结构,以及在检索BTREE时如何使用AHI, AHI初始化 AHI的初始化发生在Innodb启动时,在为buffer pool分配完内存后(buf_pool_init),创建AHI相关结构体,配置其所需要的内存:       btr_search_sys_create(buf_pool_get_curr_size() / sizeof(void*) / 64); 内存占用默认不超过buffer pool大小的64分之一 AHI的初始化主要包括以下几个重要的对象: btr_search_latch_temp  读写锁对象,但外部使用的是btr_search_latch: #define btr_search_latch     (*btr_search_latch_temp) btr_search_sys,AHI的全局控制结构体,只有一个成员:       hash_table_t*     hash_index; 创建哈希表 btr_search_sys->hash_index = ha_create(hash_size, 0, MEM_HEAP_FOR_BTR_SEARCH, 0); 其他相关结构体: 每个索引对象为维护的index->search_info,类型为btr_search_t,其成员包括: ulint   ref_count 该index上被AHI索引的block数量,需要通过btr_search_latch保护 buf_block_t* root_guess 上次获取的root page ulint   hash_analysis 当该值超过BTR_SEARCH_HASH_ANALYSIS时,才会去更新AHI的entry. 这主要是为了避免太过频繁的更新AHI(默认超过17次查询后,才会去尝试更新AHI) 在为search info重设新的n_fields和n_bytes时,会重设该字段为0 ibool   last_hash_succ 如果上次的搜索成功了,并使用了AHI,则设置为TRUE ulint   n_hash_potential 使用AHI持续成功检索的次数. 在函数btr_search_guess_on_hash中,当成功使用了一次AHI后,如果当前n_hash_potential<BTR_SEARCH_BUILD_LIMIT+5=105,则将n_hash_potential++ […]