日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL引擎之MyISAM,InnoDB,Btree与B+tree

發(fā)布時間:2024/9/20 数据库 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL引擎之MyISAM,InnoDB,Btree与B+tree 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目錄:

  • MyISAM與InnoDB模塊
  • Btree模塊
  • B-tree與哈希索引的區(qū)別

一:MyISAM:

創(chuàng)建一個myisam存儲引擎的表的時候會出現(xiàn)三個文件

  • tb_demo.frm,存儲表定義; 2.tb_demo.MYD,存儲數(shù)據(jù); 3.tb_demo.MYI,存儲索引。
  • 因為MyISAM表有無法處理事務,所以它只適合在以下情況下使用
    • 1.選擇密集型的表。MyISAM存儲引擎在篩選大量數(shù)據(jù)時非常迅速,這是它最突出的優(yōu)點。
    • 2.插入密集型的表。MyISAM的并發(fā)插入特性允許同時選擇和插入數(shù)據(jù)。例如:MyISAM存儲引擎很適合管理郵件或Web服務器日志數(shù)據(jù)。

二:InnoDB:

  • 更新密集的表。InnoDB存儲引擎特別適合處理多重并發(fā)的更新請求。
  • 事務。InnoDB存儲引擎是支持事務的標準MySQL存儲引擎。
  • 自動災難恢復。與其它存儲引擎不同,InnoDB表能夠自動從災難中恢復。
  • 外鍵約束。MySQL支持外鍵的存儲引擎只有InnoDB。
  • 支持自動增加列AUTO_INCREMENT屬性。

?

三. Innodb與MyIASM引擎的區(qū)別與應用場景

1. Innodb與MyIASM引擎的區(qū)別

(1)事務處理:

  • MyIASM是非事務安全型的,而InnoDB是事務安全型的(支持事務處理等高級處理);

(2)鎖機制不同:

  • MyIASM是表級鎖,而InnoDB是行級鎖;

(3)select ,update ,insert ,delete 操作:

  • MyIASM:如果執(zhí)行大量的SELECT,MyISAM是更好的選擇。

  • InnoDB:如果你的數(shù)據(jù)執(zhí)行大量的INSERT或UPDATE,出于性能方面的考慮,應該使用InnoDB表。

(4)查詢表的行數(shù)不同:

  • MyIASM:select count() from table,MyISAM只要簡單的讀出保存好的行數(shù),注意的是,當count()語句包含 where條件時,兩種表的操作是一樣的。
  • InnoDB : InnoDB 中不保存表的具體行數(shù),也就是說,執(zhí)行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行。

(5)外鍵支持:

  • mysiam表不支持外鍵,而InnoDB支持。

2.為什么MyIASM會比Innodb 的查詢速度快

  • InnoDB在做SELECT的時候,要維護的東西比MyIASM引擎多很多;
  • 數(shù)據(jù)塊,INNODB要緩存,MyIASM只緩存索引塊, 這中間還有換進換出的減少;
  • innodb尋址要映射到塊,再到行,MyIASM記錄的直接是文件的OFFSET,定位比INNODB要快;
  • INNODB還需要維護MVCC一致;雖然你的場景沒有,但他還是需要去檢查和維護。
  • MVCC ( Multi-Version Concurrency Control )多版本并發(fā)控制 。

應用場景:

  • MyIASM適合:(1)做很多count 的計算;(2)插入不頻繁,查詢非常頻繁;(3)沒有事務。

  • InnoDB適合:(1)可靠性要求比較高,或者要求事務;(2)表更新和查詢都相當?shù)念l繁,并且行鎖定的機會比較大的情況。

 

四. Btree與b+tree

1. Btree:

  • B-tree是一種多路自平衡搜索樹,它類似普通的二叉樹,但是Btree允許每個節(jié)點有更多的子節(jié)點。Btree示意圖如下:

  • B樹的搜索,從根結(jié)點開始,如果查詢的關(guān)鍵字與結(jié)點的關(guān)鍵字相等,那么就命中;否則,如果查詢關(guān)鍵字比結(jié)點關(guān)鍵字小,就進入左兒子;如果比結(jié)點關(guān)鍵字大,就進入右兒子;如果左兒子或右兒子的指針為空,則報告找不到相應的關(guān)鍵字;

  • 如果B樹的所有非葉子結(jié)點的左右子樹的結(jié)點數(shù)目均保持差不多(平衡),那么B樹的搜索性能逼近二分查找;但它比連續(xù)內(nèi)存空間的二分查找的優(yōu)點是,改變B樹結(jié)構(gòu)(插入與刪除結(jié)點)不需要移動大段的內(nèi)存數(shù)據(jù),甚至通常是常數(shù)開銷;

  • 右邊也是一個B樹,但它的搜索性能已經(jīng)是線性的了;同樣的關(guān)鍵字集合有可能導致不同的樹結(jié)構(gòu)索引;所以,使用B樹還要考慮盡可能讓B樹保持左圖的結(jié)構(gòu),和避免右圖的結(jié)構(gòu),也就是所謂的“平衡”問題;

  • 實際使用的B樹都是在原B樹的基礎(chǔ)上加上平衡算法,即“平衡二叉樹”;如何保持B樹結(jié)點分布均勻的平衡算法是平衡二叉樹的關(guān)鍵;平衡算法是一種在B樹中插入和刪除結(jié)點的策略;

由上圖可知 Btree 的一些特點:

  • 所有鍵值分布在整個樹中
  • 任何關(guān)鍵字出現(xiàn)且只出現(xiàn)在一個節(jié)點中
  • 搜索有可能在非葉子節(jié)點結(jié)束
  • 在關(guān)鍵字全集內(nèi)做一次查找,性能逼近二分查找算法

2. B+tree:

B+tree是Btree的變體,也是一種多路搜索樹:

1.其定義基本與B-樹同,除了:2.非葉子結(jié)點的子樹指針與關(guān)鍵字個數(shù)相同;3.非葉子結(jié)點的子樹指針P[i],指向關(guān)鍵字值屬于[K[i], K[i+1])的子樹(B-樹是開區(qū)間);5.為所有葉子結(jié)點增加一個鏈指針;6.所有關(guān)鍵字都在葉子結(jié)點出現(xiàn);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

  • B+的搜索與B-樹也基本相同,區(qū)別是B+樹只有達到葉子結(jié)點才命中(B-樹可以在非葉子結(jié)點命中),其性能也等價于在關(guān)鍵字全集做一次二分查找;

B+tree的特性:

1.所有關(guān)鍵字都出現(xiàn)在葉子結(jié)點的鏈表中(稠密索引),且鏈表中的關(guān)鍵字恰好是有序的;2.不可能在非葉子結(jié)點命中;3.非葉子結(jié)點相當于是葉子結(jié)點的索引(稀疏索引),葉子結(jié)點相當于是存儲(關(guān)鍵字)數(shù)據(jù)的數(shù)據(jù)層;4.更適合文件索引系統(tǒng);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

btree和B+tree的區(qū)別:

  • (1)B+tree的非葉子節(jié)點不存儲真正的data,而btree可以
  • (2)增加了一個鏈指針
  • (3)btree支持數(shù)據(jù)的延展性,B+tree支持數(shù)據(jù)的擴展性

B*Tree:

是B+樹的變體,在B+樹的非根和非葉子結(jié)點再增加指向兄弟的指針;

  • B*樹定義了非葉子結(jié)點關(guān)鍵字個數(shù)至少為(2/3)*M,即塊的最低使用率為2/3(代替B+樹的1/2);
  • B+樹的分裂:當一個結(jié)點滿時,分配一個新的結(jié)點,并將原結(jié)點中1/2的數(shù)據(jù)復制到新結(jié)點,最后在父結(jié)點中增加新結(jié)點的指針;B+樹的分裂只影響原結(jié)點和父結(jié)點,而不會影響兄弟結(jié)點,所以它不需要指向兄弟的指針;
  • B*樹的分裂:當一個結(jié)點滿時,如果它的下一個兄弟結(jié)點未滿,那么將一部分數(shù)據(jù)移到兄弟結(jié)點中,再在原結(jié)點插入關(guān)鍵字,最后修改父結(jié)點中兄弟結(jié)點的關(guān)鍵字(因為兄弟結(jié)點的關(guān)鍵字范圍改變了);如果兄弟也滿了,則在原結(jié)點與兄弟結(jié)點之間增加新結(jié)點,并各復制1/3的數(shù)據(jù)到新結(jié)點,最后在父結(jié)點增加新結(jié)點的指針;
  • 所以,B*樹分配新結(jié)點的概率比B+樹要低,空間使用率更高;

三. B-tree與哈希索引的區(qū)別

1)B+tree的索引:

  • 是按照順序存儲的,所以,如果按照B+tree索引,可以直接返回,帶順序的數(shù)據(jù),但這個數(shù)據(jù)只是該索引列含有的信息。因此是順序I/O
  • 適用于: 精確匹配 、范圍匹配 、最左匹配

2)Hash索引:

  • 索引列值的哈希值+數(shù)據(jù)行指針:因此找到后還需要根據(jù)指針去找數(shù)據(jù),造成隨機I/O
  • 適合: 精確匹配
  • 不適合: 模糊匹配 、范圍匹配 、不能排序

來源:https://blog.csdn.net/longlong6682/article/details/104805941

與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的MySQL引擎之MyISAM,InnoDB,Btree与B+tree的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。