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

1、Mysql的兩種存儲引擎html

  一、MyISAM:sql

    ①不支持事務,可是整個操做是原子性的(事務具有四種特性:原子性、一致性、隔離性、持久性)緩存

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

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

      表共享讀鎖和表獨佔寫鎖。在對MyISAM表進行讀操做時,不會阻塞其餘用戶對同一張表的讀請求,可是會阻塞其餘用戶對錶的寫請求;對其進行寫操做時會阻塞對同一表讀操做和寫操做spa

      MyISAM存儲引擎的讀鎖和寫鎖是互斥的,讀寫操做是串行的。那麼,一個進程請求某個MyISAM表的讀鎖,同時另外一個進程也請求同一表的寫鎖,MySQL如何處理呢?答案是寫進程先得到鎖。不只如此,即便讀請求先到鎖等待隊列,寫請求後到,寫鎖也會插到讀鎖請求以前!這是由於MySQL認爲寫請求通常比讀請求要重要。這也正是MyISAM表不太適合於有大量更新操做和查詢操做應用的緣由,由於,大量的更新操做會形成查詢操做很難得到讀鎖,從而可能永遠阻塞。這種狀況有時可能會變得很是糟糕! 操作系統

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

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

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

    ⑤採用非彙集索引,索引文件的數據域存儲指向數據文件的指針。輔索引與主索引基本一致,可是輔索引不用保證惟一性。

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

    ⑦對於AUTO_INCREMENT類型的字段,在MyISAM表中,能夠和其餘字段一塊兒創建聯合索引

 

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

    

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

    

 

  二、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

相關文章
相關標籤/搜索