在數據庫中存的就是一張張有着千絲萬縷關係的表,因此表的設計的好壞,將直接影像這整個數據庫。而在設計表的時候,咱們都關注一個問題,使用什麼存儲引擎。接下來小編將重點爲你們介紹對比兩種常見的innodb和MyISAM搜索引擎~mysql
友情連接:MySQL筆記文檔算法
一、innodbsql
a、Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。數據庫
b、Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。(默認的數據庫隔離級別)緩存
c、Read committed (讀已提交):可避免髒讀的發生。安全
d、Read uncommitted (讀未提交):最低級別,任何狀況都沒法保證。服務器
(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。markdown
二、MyISAM併發
三、總結:高併發
用戶併發操做的性能。
若是須要執行大量的SELECT查詢,那麼MyISAM是更好的選擇。
二 行級鎖和外鍵約束
mysql支持三種鎖定級別,行級、頁級、表級。其中:
表級:直接鎖定整張表,在你鎖按期間,其它進程沒法對該表進行寫操做。若是你是寫鎖,則其它進程則讀也不容許行級:僅對指定的記錄進行加鎖,這樣其它進程仍是能夠對同一個表中的其它記錄進行操做
頁級:表級鎖速度快,但衝突多,行級衝突少,但速度慢。因此取了折衷的頁級,一次鎖定相鄰的一組記錄
一、InnoDB
支持行級鎖定,可是表的行鎖也不是絕對的,若是在執行一個SQL語句時MySQL不能肯定要掃描的範圍
即 update table_name set age='24' where name like '%福%';不明確主鍵,在執行增刪改查操做時,會鎖全表
二、MyISAM
支持表級鎖定,沒有提供對數據庫事務的支持,也不支持行級鎖和外鍵,所以當INSERT(插入)或UPDATE(更新)數據時即寫操做須要鎖定整個表
一、InnoDB
基於磁盤的資源是InnoDB表空間數據文件和它的日誌文件,InnoDB 表的大小隻受限於操做系統文件的大小
二、MyISAM
存儲表的數據,另外一個是.MYI文件,存儲的是索引。操做系統對大文件的操做是比較
慢的,這樣將表分爲三個文件,那麼.MYD這個文件單獨來存放數據天然能夠優化數據
庫的查詢等操做。有索引管理和字段管理。
一、InnoDB(索引組織表)
使用的聚簇索引、索引就是數據,順序存儲,所以能緩存索引,也能緩存數據
二、MyISAM(堆組織表)
使用的是非聚簇索引、索引和文件分開,隨機存儲,只能緩存索引
一、InnoDB
必須導出SQL來備份,LOAD TABLE FROM MASTER操做對InnoDB是不起做用的,解決方法是首先把InnoDB表改爲MyISAM表,導入數據後再改爲InnoDB表,可是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。
二、MyISAM
應對錯誤編碼致使的數據恢復速度快。MyISAM的數據是以文件的形式存儲,因此在跨平臺的數據轉移中會很方便。在備份和恢復時可單獨針對某個表進行操做。
一、InnoDB
二、MyISAM
一、Innodb
結構,這棵樹的葉節點data域保存了完整的數據記錄,這種索引就是彙集索引。
a、由於InnoDB的數據文件自己要按主鍵彙集,因此InnoDB要求表必須有主鍵(MyISAM能夠沒有)。
b、若是沒有顯式指定,則MySQL系統會自動選擇一個能夠惟一標識數據記錄的列做爲主鍵。
c、若是不存在惟一標識數據記錄的列,則MySQL自動爲InnoDB表生成一個隱含字段做爲主鍵,這個字段長度爲6個字節,類型爲長整形。
InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址即InnoDB的全部輔助索引都引用主鍵做爲data域
二、MyIASM
MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址,即葉節點的data域存放的是數據記錄的地址
首先按照B+Tree搜索算法搜索索引,若是指定的Key存在,則取出其data域的值,而後以data域的值爲地址,讀取相應數據記錄。
主鍵索引和輔助索引(結構上沒有任何區別,只是主索引要求key是惟一的,而輔助索引的key能夠重複)
三、注意
MyISAM表中,能夠和其餘字段一塊兒創建聯合索引。
InnoDB要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行
數便可。注意的是,當count()語句包含where條件時,兩種表的操做是同樣的