InnoDB Adaptive Hash Index(AHI)
生活随笔
收集整理的這篇文章主要介紹了
InnoDB Adaptive Hash Index(AHI)
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
2. InnoDB AHI的維護(hù) 為了避免頻繁的更新AHI帶來(lái)性能的開(kāi)銷(xiāo),InnoDB的AHI不是隨時(shí)可以更新的。 首先要滿足 index->search_info->hash_analysis >= BTR_SEARCH_HASH_ANALYSIS(17),即在這個(gè)索引上至少進(jìn)行了17此查詢(xún)(指通過(guò)B+樹(shù)的路徑查詢(xún),不包含通過(guò)AHI查找)才進(jìn)行一次是否需要建hash的分析。 分析是否需要建索引: buf_block_struct->n_hash_helps?用相同的前綴(n_fields,n_bytes,left_side)進(jìn)行的查詢(xún) 成功的次數(shù)(btr_search_update_block_hash_info). ?如果次數(shù)大于該頁(yè)記錄總數(shù)的1/16時(shí),就有可能在該頁(yè)上建立AHI.? 并且index->search_info->n_hash_potential >= BTR_SEARCH_BUILD_LIMIT(100),即表示查詢(xún)已經(jīng)連續(xù)成功使用Hash Index(btr_search_guess_on_hash), 或者是可能成功使用Hash Index的次數(shù)(btr_search_info_update_hash) 大于100. 原來(lái)沒(méi)有創(chuàng)建hash,或者原來(lái)創(chuàng)建hash的前綴參數(shù)發(fā)生了改變(n_fields, n_bytes, left_side),則需要重新對(duì)這個(gè)頁(yè)上的記錄創(chuàng)建AHI.
索引的創(chuàng)建: 如果需要?jiǎng)?chuàng)建新的AHI,如果原來(lái)在這頁(yè)上已經(jīng)建立和哈希索引,則需要先刪除原來(lái)的這頁(yè)上的AHI。建立新的AHI,從這頁(yè)的第一個(gè)記錄開(kāi)始,到最后的一個(gè)記錄,依次根據(jù)前綴的參數(shù)(n_fields,n_bytes,left_side)計(jì)算hash的key,然后插入哈希表中。
插入記錄時(shí)添加哈希記錄: 當(dāng)一頁(yè)插入一條記錄時(shí),如果這頁(yè)已經(jīng)被創(chuàng)建哈希,則將這個(gè)新記錄也插入哈希表。函數(shù): btr_search_update_hash_node_on_insert(); btr_search_update_hash_on_insert()。
3.?InnoDB?AHI前綴參數(shù)的確定: hash前綴參數(shù)(n_fields, n_bytes, left_side)的確定需要根據(jù)這次查詢(xún)的結(jié)果來(lái)確定,即查詢(xún)結(jié)束后btr_cur_t結(jié)構(gòu)中的參數(shù)來(lái)確定;主要是比較cursor->up_match, cursor->up_bytes, cursor->low_match, cursor->low_bytes,即查詢(xún)結(jié)束后查詢(xún)游標(biāo)指向的前后記錄的匹配程度來(lái)確定前綴的參數(shù)。 以匹配少的記錄作為前綴,即cursor->up_match,cursor->up_bytes組合與cursor->low_match, cursor->low_bytes比較結(jié)果,如果前者大則用后者來(lái)更新info->n_fields和info->n_bytes,此時(shí)info->left_side = TRUE,即當(dāng)遇到相同記錄前綴時(shí),是選擇最左邊插入hash表,后者大則用前者來(lái)更新info->n_fields和info->n_bytes,此時(shí)info->left_side = FALSE,當(dāng)遇到相同記錄前綴時(shí),是選擇最右邊的記錄插入hash表,即相同的前綴只用保留一個(gè)記錄在hash表中。 如果分析過(guò)程中發(fā)現(xiàn)查詢(xún)的結(jié)果和上次得到的結(jié)果不同,則需要重新前綴參數(shù)(n_fields, n_bytes, left_side)。
4. InnoDB AHI使用 在btr_cur_search_to_nth_level中,在使用B+Tree搜索前,先搜索AHI(btr_search_guess_on_hash),看是否可以找到相應(yīng)的記錄。查找到記錄后還需要檢查找到的記錄是否符合要求(btr_search_check_guess),即根據(jù)Search Path(PAGE_CUR_G, PAGE_CUR_GE, PAGE_CUR_L, PAGE_CUR_LE)與tuple和當(dāng)前記錄的比較結(jié)果btr_cur_t結(jié)構(gòu)中的參數(shù)來(lái)判斷。如果符合要求則返回相應(yīng)的記錄,否則還是采用B+Tree來(lái)查詢(xún)。
總結(jié)
以上是生活随笔為你收集整理的InnoDB Adaptive Hash Index(AHI)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Html.from()加载网络图片
- 下一篇: untiy 实时人像抠图