做爲Java程序員,MySQL數據庫你們平時應該都沒少使用吧,對MySQL數據庫的引擎應該也有所瞭解,這篇文章就讓我詳細的說說MySQL數據庫的Innodb和MyIASM兩種引擎以及其索引結構。也來鞏固一下本身對這塊知識的掌握。html
Innodb引擎提供了對數據庫ACID事務的支持,而且實現了SQL標準的四種隔離級別,關於數據庫事務與其隔離級別的內容請見數據庫事務與其隔離級別這篇文章。該引擎還提供了行級鎖和外鍵約束,它的設計目標是處理大容量數據庫系統,它自己其實就是基於MySQL後臺的完整數據庫系統,MySQL運行時Innodb會在內存中創建緩衝池,用於緩衝數據和索引。可是該引擎不支持FULLTEXT類型的索引,並且它沒有保存表的行數,當SELECT COUNT(*) FROM TABLE時須要掃描全表。當須要使用數據庫事務時,該引擎固然是首選。因爲鎖的粒度更小,寫操做不會鎖定全表,因此在併發較高時,使用Innodb引擎會提高效率。可是使用行級鎖也不是絕對的,若是在執行一個SQL語句時MySQL不能肯定要掃描的範圍,InnoDB表一樣會鎖全表。程序員
MyIASM是MySQL默認的引擎,可是它沒有提供對數據庫事務的支持,也不支持行級鎖和外鍵,所以當INSERT(插入)或UPDATE(更新)數據時即寫操做須要鎖定整個表,效率便會低一些。不過和Innodb不一樣,MyIASM中存儲了表的行數,因而SELECT COUNT(*) FROM TABLE時只須要直接讀取已經保存好的值而不須要進行全表掃描。若是表的讀操做遠遠多於寫操做且不須要數據庫事務的支持,那麼MyIASM也是很好的選擇。算法
大尺寸的數據集趨向於選擇InnoDB引擎,由於它支持事務處理和故障恢復。數據庫的大小決定了故障恢復的時間長短,InnoDB能夠利用事務日誌進行數據恢復,這會比較快。主鍵查詢在InnoDB引擎下也會至關快,不過須要注意的是若是主鍵太長也會致使性能問題,關於這個問題我會在下文中講到。大批的INSERT語句(在每一個INSERT語句中寫入多行,批量插入)在MyISAM下會快一些,可是UPDATE語句在InnoDB下則會更快一些,尤爲是在併發量大的時候。數據庫
索引(Index)是幫助MySQL高效獲取數據的數據結構。MyIASM和Innodb都使用了樹這種數據結構作爲索引,關於樹我也曾經寫過一篇文章樹是一種偉大的數據結構,只是本身的理解,有興趣的朋友能夠去閱讀。下面我接着講這兩種引擎使用的索引結構,講到這裏,首先應該談一下B-Tree和B+Tree。數據結構
B+Tree是B-Tree的變種,那麼我就先講B-Tree吧,相信你們都知道紅黑樹,這是我前段時間學《算法》一書時,實現的一顆紅黑樹,你們能夠參考。其實紅黑樹相似2,3-查找樹,這種樹既有2叉結點又有3叉結點。B-Tree也與之相似,它的每一個結點作多能夠有d個分支(叉),d稱爲B-Tree的度,以下圖所示,它的每一個結點能夠有4個元素,5個分支,因而它的度爲5。B-Tree中的元素是有序的,好比圖中元素7左邊的指針指向的結點中的元素都小於7,而元素7和16之間的指針指向的結點中的元素都處於7和16之間,正是知足這樣的關係,才能高效的查找:首先從根節點進行二分查找,找到就返回對應的值,不然就進入相應的區間結點遞歸的查找,直到找到對應的元素或找到null指針,找到null指針則表示查找失敗。這個查找是十分高效的,其時間複雜度爲O(logN)(以d爲底,當d很大時,樹的高度就很低),由於每次檢索最多隻須要檢索樹高h個結點。併發
接下來就該講B+Tree了,它是B-Tree的變種,以下面兩張圖所示:性能
從圖中就能夠看出,B+Tree的內部結點不存儲數據,只存儲指針,而葉子結點則只存儲數據,不存儲指針。而且在其每一個葉子節點上增長了一個指向湘…�"/database/DB2/" target="_blank" class="keylink">DB2tK219O92rXjtcTWuNXro6zV4rj208W7r8zhuN/H+Lzkt8POyrXE0NTE3KOsscjI59Tatdq2/tXFzbzW0NKqsunRr7z8zqq00zE4tb00ObXEy/nT0Mr9vt2jrLWx1dK1vTE4uvOjrNa70OjLs9fFvdq147rN1rjV68uz0PKx6cD6vs2/ydLU0ru0ztDUt8POyrW9y/nT0Mr9vt292rXjo6y8q7TzzOG1vcHLx/i85LLp0a/Qp8LKoaM8L3A+DQo8aDMgaWQ9"myisam引擎的索引結構">MyISAM引擎的索引結構設計
MyISAM引擎的索引結構爲B+Tree,其中B+Tree的數據域存儲的內容爲實際數據的地址,也就是說它的索引和實際的數據是分開的,只不過是用索引指向了實際的數據,這種索引就是所謂的非彙集索引。指針
MyISAM引擎的索引結構一樣也是B+Tree,可是Innodb的索引文件自己就是數據文件,即B+Tree的數據域存儲的就是實際的數據,這種索引就是彙集索引。這個索引的key就是數據表的主鍵,所以InnoDB表數據文件自己就是主索引。日誌
由於InnoDB的數據文件自己要按主鍵彙集,因此InnoDB要求表必須有主鍵(MyISAM能夠沒有),若是沒有顯式指定,則MySQL系統會自動選擇一個能夠惟一標識數據記錄的列做爲主鍵,若是不存在這種列,則MySQL自動爲InnoDB表生成一個隱含字段做爲主鍵,這個字段長度爲6個字節,類型爲長整形。
而且和MyISAM不一樣,InnoDB的輔助索引數據域存儲的也是相應記錄主鍵的值而不是地址,因此當以輔助索引查找時,會先根據輔助索引找到主鍵,再根據主鍵索引找到實際的數據。因此Innodb不建議使用過長的主鍵,不然會使輔助索引變得過大。建議使用自增的字段做爲主鍵,這樣B+Tree的每個結點都會被順序的填滿,而不會頻繁的分裂調整,會有效的提高插入數據的效率。
轉自:http://www.2cto.com/database/201503/385669.html