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