最新国产好看的视频,伊人天堂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索引,索引記錄保存在葉子上,默認(rèn)的索引頁大小是16K。當(dāng)有新的記錄插入時,innodb出于對將來的insert和update操作的考慮,會嘗試留下1/16的空閑頁大小。

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

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

Insert Buffering

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

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

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

Disk I/O for Flushing the Insert Buffer

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

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

Adaptive Hash Indexes

自適應(yīng)哈希索引(AHI)使得innodb在緩沖池?fù)碛凶銐虻膬?nèi)存和某些工作負(fù)載下,看起來更像一個內(nèi)存數(shù)據(jù)庫,并且不會犧牲任何事務(wù)的特點(diǎn)和穩(wěn)定性。這個特色由參數(shù)innodb_adaptive_hash_index控制,動態(tài)參數(shù),默認(rèn)為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有這個機(jī)制,可以監(jiān)控索引的搜索情況,如果它注意到有些查詢通過建立哈希索引可以優(yōu)化查詢,那么它會自動建立,所以說它是“自適應(yīng)的”。

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

哈希索引的創(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ù)大小,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-02-02
  • 高效的mysql分頁方法及原理

    高效的mysql分頁方法及原理

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

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

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

    mysql常用命令以及小技巧

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

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

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

    一文詳解MySQL?Join使用原理

    JOIN是一種非常常見的操作,用于將兩個或多個表中的數(shù)據(jù)合并到一個結(jié)果集中。MySQL支持多種JOIN類型,本文通過代碼示例詳細(xì)介紹了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)錯誤的解決辦法,文中通過圖文將解決的辦法介紹的非常詳細(xì),對大家學(xué)習(xí)或者使用mysql具有一定的參考借鑒價值,需要的朋友可以參考下
    2024-03-03
  • percona-toolkit之pt-kill 殺掉mysql查詢或連接的方法

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

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

    MySQL最左匹配原則詳細(xì)分析

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

最新評論

盐津县| 镶黄旗| 云浮市| 漳州市| 丹凤县| 青岛市| 泸水县| 临沭县| 祁连县| 景泰县| 太湖县| 马龙县| 林口县| 黑河市| 凉城县| 涞水县| 乌拉特中旗| 东光县| 诏安县| 东乌珠穆沁旗| 平度市| 泉州市| 通化县| 皋兰县| 阿克苏市| 锡林浩特市| 德惠市| 广西| 镇宁| 揭西县| 天峨县| 聊城市| 西乌珠穆沁旗| 黄浦区| 平凉市| 措勤县| 蒲江县| 伽师县| 周口市| 西城区| 浦县|