1. 程式人生 > >Mysql的兩種存儲引擎以及區別

Mysql的兩種存儲引擎以及區別

myisam delet b+ recover 限制 inf image 持久 事務

一、Mysql的兩種存儲引擎

  1、MyISAM:

    ①不支持事務,但是整個操作是原子性的(事務具備四種特性:原子性、一致性、隔離性、持久性)

    ②不支持外鍵,支持表鎖,每次所住的是整張表

     MyISAM的表鎖有讀鎖和寫鎖(兩個鎖都是表級別):

      表共享讀鎖和表獨占寫鎖。在對MyISAM表進行讀操作時,不會阻塞其他用戶對同一張表的讀請求,但是會阻塞其他用戶對表的寫請求;對其進行寫操作時會阻塞對同一表讀操作和寫操作

      MyISAM存儲引擎的讀鎖和寫鎖是互斥的,讀寫操作是串行的。那麽,一個進程請求某個MyISAM表的讀鎖,同時另一個進程也請求同一表的寫鎖,MySQL如何處理呢?答案是寫進程先獲得鎖。不僅如此,即使讀請求先到鎖等待隊列,寫請求後到,寫鎖也會插到讀鎖請求之前!這是因為MySQL認為寫請求一般比讀請求要重要。這也正是MyISAM表不太適合於有大量更新操作和查詢操作應用的原因,因為,大量的更新操作會造成查詢操作很難獲得讀鎖,從而可能永遠阻塞。

這種情況有時可能會變得非常糟糕!

    ③一個MyISAM表有三個文件:索引文件,表結構文件,數據文件

    ④存儲表的總行數,執行select count(*) from table時只要簡單的讀出保存好的行數即可

      (myisam存儲引擎的表,count(*)速度快的也僅僅是不帶where條件的count。這個想想容易理解的,因為你帶了where限制條件,原來所以中緩存的表總數能夠直接返回用嗎?不能用。這個查詢引擎也是需要根據where條件去表中掃描數據,進行統計返回的。)

    ⑤采用非聚集索引,索引文件的數據域存儲指向數據文件的指針。輔索引與主索引基本一致,但是輔索引不用保證唯一性。

    ⑥支持全文索引和空間索引

    ⑦對於AUTO_INCREMENT類型的字段,在MyISAM表中,可以和其他字段一起建立聯合索引

    MyISAM的主索引圖:索引文件的每個數據域存儲指向數據文件的指針(每個索引指向了數據地址)

    技術分享圖片

    MyISAM的輻索引:索引文件的每個數據域存儲指向數據文件的指針(每個索引指向了數據地址),輻索引不用保證唯一性

    技術分享圖片

  2、Innodb:

    ①支持事務,支持事務的四種隔離級別;是一種具有事務(commit)、回滾(rollback)和崩潰修復能力(crash recovery capabilities)的事務安全(transaction-safe (ACID compliant))型表。

    ②支持行鎖和外鍵約束,因此可以支持寫並發

    ③不存儲總行數;也就是說,執行select count(*) from table時,InnoDB要掃描一遍整個表來計算有多少行。註意的是,當count(*)語句包含 where條件時,兩種表的操作是一樣的。

    ④對於AUTO_INCREMENT類型的字段,InnoDB中必須包含只有該字段的索引

    ⑤DELETE FROM table時,InnoDB不會重新建立表,而是一行一行的刪除

    ⑥一個Innodb表存儲在一個文件內(共享表空間,表大小不受操作系統的限制),也可能為多個(設置為獨立表空間,表大小受操作系統限制,大小為2G),受操作系統文件大小的限制

    ⑦主鍵索引采用聚集索引(索引的數據域存儲數據文件本身),輔索引的數據域存儲主鍵的值;因此從輔索引查找數據,需要先通過輔索引找到主鍵值,再訪問主鍵索引;最好使用自增主鍵,防止插入數據時,為維持B+樹結構,文件的大調整。

    Innodb的主索引圖:(索引位置上存儲的直接是數據本身)

    技術分享圖片

    Innodb的輻索引圖:

    技術分享圖片

    總結大圖:

    技術分享圖片

    參考:

    https://www.cnblogs.com/wangdake-qq/p/7358322.html

    https://blog.csdn.net/qq_35181209/article/details/78030110

Mysql的兩種存儲引擎以及區別