最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

淺談innodb的索引頁結(jié)構(gòu),插入緩沖,自適應(yīng)哈希索引

 更新時間:2017年03月29日 09:33:48   投稿:jingxian  
下面小編就為大家?guī)硪黄獪\談innodb的索引頁結(jié)構(gòu),插入緩沖,自適應(yīng)哈希索引。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

Physical Structure of an InnoDB Index

所有的innodb索引都是btree索引,索引記錄保存在葉子上,默認的索引頁大小是16K。當有新的記錄插入時,innodb出于對將來的insert和update操作的考慮,會嘗試留下1/16的空閑頁大小。

如果索引記錄是完全按照索引記錄的大小順序插入的,那么索引也將填滿整個頁大小的15/16,如果插入順序完全隨機,那么索引頁基本上填充為1/2至15/16自建。如果填充因子低于1/2,innodb會嘗試重建b-tree。

Mysql5.6以后,可以通過innodb_page_size參數(shù)設(shè)置當前實例下每個索引頁的大小,一旦設(shè)定,無法再更改回來。推薦的配置一般是16K,8K或者4K。另外假如一個Mysql實例設(shè)置了不同于默認值的innodb_page_size A,那么將無法使用其他不同于A值的實例上的文件(比如做一個物理備份和恢復(fù))

Insert Buffering

數(shù)據(jù)庫應(yīng)用通常按照主鍵順序插入的,在這種情況下,因為聚集索引的順序和這個主鍵值的順序完全一致,insert操作將會減少很多的隨機IO。

另一方面,二級索引通常不是唯一的,那么在二級索引中插入數(shù)據(jù)時是一個相對隨機的順序。同樣的,delete和update操作在影響數(shù)據(jù)頁時,涉及到索引的變更,在二級索引上也并不是緊挨著的。這就導(dǎo)致了大量的隨機IO。

當插入一條記錄,或者從非唯一的二級索引刪除一條記錄,innodb首先會去檢查該二級索引頁是否在緩沖池中。如果在緩沖池,innodb將會直接在內(nèi)存中修改這個索引頁。如果該索引也不在緩沖池,那么innodb將會將這個修改記錄到插入緩沖,也就是insertbuffer。Insert buffer通常都比較小,所以能夠保證全部在緩沖池中,并且更新非常頻繁。這個修改的進程就是change buffering(通常情況下,它只會只作用于insert操作,所以也被稱為insertbuffering,而該數(shù)據(jù)結(jié)構(gòu)就是insert buffer)

Disk I/O for Flushing the Insert Buffer

那么插入緩沖如何減少隨機IO的呢?每個一段時間,insert buffer會去合并在insertbuffer中的二級非唯一索引。通常情況下,它會合并N個修改到同一個btree索引的索引頁中,從而節(jié)約了很多IO操作。經(jīng)測試,insertbuffer可以提高15倍的插入速度。

在事務(wù)提交后,insert buffer可能還在合并寫入。所以,假如當DB異常重啟,reovery階段,當有非常多的二級索引需要更新或插入時,insert buffer將可能花費很長時間,甚至幾個小時。在這個階段,磁盤IO將會增加,那么就會導(dǎo)致disk-bound類型的查詢有顯著的性能下滑。

Adaptive Hash Indexes

自適應(yīng)哈希索引(AHI)使得innodb在緩沖池擁有足夠的內(nèi)存和某些工作負載下,看起來更像一個內(nèi)存數(shù)據(jù)庫,并且不會犧牲任何事務(wù)的特點和穩(wěn)定性。這個特色由參數(shù)innodb_adaptive_hash_index控制,動態(tài)參數(shù),默認為on表示打開自適應(yīng)哈希索引,關(guān)閉AHI后內(nèi)置哈希表將會被立馬清空,而正常的操作依舊可以繼續(xù),只是直接通過訪問B-TREE索引。重新使能AHI后哈希表又會被重建。

通過觀察搜素模式,mysql會利用index key的前綴建立哈希索引,這個前綴可以是任意長度,并且它可能僅僅是B-tree上的某些值,而不是整個b-tree。哈希索引通過檢測,會在經(jīng)常被訪問的index pages上建立哈希索引。

如果一個表幾乎大部分都在緩沖池中,那么建立一個哈希索引能夠加快等值查詢,通過將btree的索引值轉(zhuǎn)換成一個排序指針。Innodb有這個機制,可以監(jiān)控索引的搜索情況,如果它注意到有些查詢通過建立哈希索引可以優(yōu)化查詢,那么它會自動建立,所以說它是“自適應(yīng)的”。

在某些工作負載下,通過哈希索引查找?guī)淼男阅芴嵘齼r值遠大于這個額外的監(jiān)控索引搜索情況和保持這個哈希表結(jié)構(gòu)所帶來的開銷。但某些時候,在負載較高的情況下,自適應(yīng)哈希索引中添加的read/write 鎖也會帶來競爭,比如高并發(fā)的join操作。Like操作和%的通配符同樣不適用于AHI。如果工作負載不適合AHI,建議將它關(guān)閉,以免帶來不必要的性能開銷。因為mysql內(nèi)部很難預(yù)示在一個特定的場合下AHI到底是否合適,推薦做一個實際工作負載的壓測(有無AHI兩種情況)。在5.6及以后版本中將會考慮讓越來越多的工作負載最好disable掉自適應(yīng)哈希索引,盡管目前而言它默認還是開啟的。

哈希索引的創(chuàng)建往往是基于現(xiàn)有的b-tree,innodb可以通過觀察b-tree的搜索情況建立任意長度的b-tree索引前綴的方式建立哈希索引。一個哈希索引可以只是部分的,僅包括b-tree index中最經(jīng)常被訪問到的頁。

你可以通過觀察show engine innodb status結(jié)果中的SEMAPHORES部分來決定是否使用自適應(yīng)哈希索引。如果你看到很多線程都在btr0sea.c文件上創(chuàng)建rw-latch上waiting,那么建議關(guān)閉掉自適應(yīng)哈希索引。本人曾經(jīng)碰到過的一個case截圖如下,典型的高并發(fā)模式下AHI引起的競爭,需要關(guān)閉AHI


以上這篇淺談innodb的索引頁結(jié)構(gòu),插入緩沖,自適應(yīng)哈希索引就是小編分享給大家的全部內(nèi)容了,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Mysql查詢數(shù)據(jù)庫或數(shù)據(jù)表中的數(shù)據(jù)量以及數(shù)據(jù)大小

    Mysql查詢數(shù)據(jù)庫或數(shù)據(jù)表中的數(shù)據(jù)量以及數(shù)據(jù)大小

    許多數(shù)據(jù)庫的元數(shù)據(jù)都是存儲在mysql中的,本文主要介紹了Mysql查詢數(shù)據(jù)庫或數(shù)據(jù)表中的數(shù)據(jù)量以及數(shù)據(jù)大小,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • 高效的mysql分頁方法及原理

    高效的mysql分頁方法及原理

    這篇文章介紹了高效的mysql分頁方法及原理,有需要的朋友可以參考一下
    2013-08-08
  • Mysql賬戶管理原理與實現(xiàn)方法詳解

    Mysql賬戶管理原理與實現(xiàn)方法詳解

    這篇文章主要介紹了Mysql賬戶管理原理與實現(xiàn)方法,結(jié)合實例形式詳細分析了mysql賬戶管理的原理、操作技巧、相關(guān)問題解決方法與注意事項,需要的朋友可以參考下
    2020-01-01
  • mysql常用命令以及小技巧

    mysql常用命令以及小技巧

    這篇文章主要分享的是mysql常用命令以及小技巧,概述清理二進制日志、mysqldump不鎖表、mysql跳過空事務(wù)等相關(guān)資料展開主題,需要的小伙伴可以參考一下,希望對你有所幫助
    2022-02-02
  • MySQL 5.7.29 + Win64 解壓版 安裝教程圖文詳解

    MySQL 5.7.29 + Win64 解壓版 安裝教程圖文詳解

    這篇文章主要介紹了MySQL 5.7.29 + Win64 解壓版 安裝教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-05-05
  • 一文詳解MySQL?Join使用原理

    一文詳解MySQL?Join使用原理

    JOIN是一種非常常見的操作,用于將兩個或多個表中的數(shù)據(jù)合并到一個結(jié)果集中。MySQL支持多種JOIN類型,本文通過代碼示例詳細介紹了Join的使用優(yōu)化,有需要的小伙伴可以參考閱讀
    2023-04-04
  • mysql的日期和時間函數(shù)

    mysql的日期和時間函數(shù)

    mysql的日期和時間函數(shù) 這里是一個使用日期函數(shù)的例子。
    2010-11-11
  • 安裝MySQl報Initializing?database?(may?take?a?long?time)錯誤解決辦法

    安裝MySQl報Initializing?database?(may?take?a?long?time)錯誤

    這篇文章主要給大家介紹了關(guān)于安裝MySQl報Initializing?database?(may?take?a?long?time)錯誤的解決辦法,文中通過圖文將解決的辦法介紹的非常詳細,對大家學(xué)習(xí)或者使用mysql具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-03-03
  • percona-toolkit之pt-kill 殺掉mysql查詢或連接的方法

    percona-toolkit之pt-kill 殺掉mysql查詢或連接的方法

    本文主要描述了percona-toolkit中pt-kill的 使用實例 ,及 一些重要參數(shù)的介紹,需要的朋友可以參考下
    2016-04-04
  • MySQL最左匹配原則詳細分析

    MySQL最左匹配原則詳細分析

    首先回顧一下什么是最左匹配(也有稱之為最左前綴)?顧名思義:最左優(yōu)先,以最左邊的為起點任何連續(xù)的索引都能匹配上。同時遇到范圍查詢(>、<、between、like)就會停止匹配
    2022-12-12

最新評論

卓资县| 正镶白旗| 永昌县| 定南县| 新田县| 裕民县| 阿克陶县| 阿拉尔市| 临泉县| 荥阳市| 长丰县| 西贡区| 双桥区| 久治县| 洪雅县| 澄城县| 临汾市| 和平县| 河曲县| 全州县| 西盟| 郓城县| 辽宁省| 泰宁县| 龙口市| 阳东县| 修武县| 岐山县| 尼勒克县| 舟曲县| 滦平县| 合作市| 孙吴县| 法库县| 抚宁县| 铜川市| 汝南县| 普安县| 苍山县| 永修县| 文化|