Innodb引擎算法
Innodb引擎提供了對數據庫ACID事務的支持,而且實現了SQL標準的四種隔離級別。 該引擎還提供了行級鎖和外鍵約束,它的設計目標是處理大容量數據庫系統,它自己其實就是基於MySQL後臺的完整數據庫系統,MySQL運行時Innodb會在內存中創建緩衝池,用於緩衝數據和索引。 可是該引擎不支持FULLTEXT類型的索引(全文索引)【5.6.24之後支持】,並且它沒有保存表的行數,當SELECT COUNT(*) FROM TABLE時須要掃描全表。 當須要使用數據庫事務時,該引擎固然是首選。因爲鎖的粒度更小,寫操做不會鎖定全表,因此在併發較高時,使用Innodb引擎會提高效率。 可是使用行級鎖也不是絕對的,若是在執行一個SQL語句時MySQL不能肯定要掃描的範圍,InnoDB表一樣會鎖全表。數據庫
MyISAM引擎使用B+Tree做爲索引結構,葉節點的data域存放的是數據記錄的地址。所以,MyISAM中索引檢索的算法爲首先按照B+Tree搜索算法搜索索引,若是指定的Key存在,則取出其data域的值,而後以data域的值爲地址,讀取相應數據記錄。
MyISAM的索引方式也叫作「非彙集」的,之因此這麼稱呼是爲了與InnoDB的彙集索引區分。安全
MyIASM引擎併發
MyIASM是MySQL默認的引擎,可是它沒有提供對數據庫事務的支持,也不支持行級鎖和外鍵,所以當INSERT(插入)或UPDATE(更新)數據時即寫操做須要鎖定整個表,效率便會低一些。 不過和Innodb不一樣,MyIASM中存儲了表的行數,因而SELECT COUNT(*) FROM TABLE 時只須要直接讀取已經保存好的值而不須要進行全表掃描。 若是表的讀操做遠遠多於寫操做且不須要數據庫事務的支持,那麼MyIASM也是很好的選擇。spa
InnoDB也使用B+Tree做爲索引結構,但具體實現方式卻與MyISAM大相徑庭。設計
區別:索引
一、InnoDB的數據文件自己就是索引文件。MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址。而在InnoDB中,表數據文件自己就是按B+Tree組織的一個索引結構,這棵樹的葉節點data域保存了完整的數據記錄。這個索引的key是數據表的主鍵,所以InnoDB表數據文件自己就是主索引。 token
二、葉節點包含了完整的數據記錄,這種索引叫作彙集索引。事務
三、由於InnoDB的數據文件自己要按主鍵彙集,因此InnoDB要求表必須有主鍵(MyISAM能夠沒有),若是沒有顯式指定,則MySQL系統會自動選擇一個能夠惟一標識數據記錄的列做爲主鍵,若是不存在這種列,則MySQL自動爲InnoDB表生成一個隱含字段做爲主鍵,這個字段長度爲6個字節,類型爲長整形。內存
四、InnoDB的全部輔助索引都引用主鍵做爲data域。
五、彙集索引這種實現方式使得按主鍵的搜索十分高效,可是輔助索引搜索須要檢索兩遍索引:首先檢索輔助索引得到主鍵,而後用主鍵到主索引中檢索得到記錄。
總結:
一、InnoDB不建議使用過長的字段做爲主鍵。由於全部輔助索引都引用主索引,過長的主索引會令輔助索引變得過大。
二、非單調(不是自增或自減的均爲非單調)的字段做爲主鍵在InnoDB中不是個好作法,由於InnoDB數據文件自己是一顆B+Tree,非單調的主鍵會形成在插入新記錄時數據文件爲了維持B+Tree的特性而頻繁的分裂調整,十分低效,而使用自增字段做爲主鍵則是一個很好的選擇。
MyIASM與InnoDB的主要區別:
一、MyIASM是非事務安全的,而InnoDB是事務安全的
二、MyIASM鎖的粒度是表級的,而InnoDB支持行級鎖
三、MyIASM支持全文類型索引,而InnoDB不支持全文索引(5.6.24之後支持)、
四、MyIASM相對簡單,效率上要優於InnoDB,小型應用能夠考慮使用MyIASM
五、MyIASM表保存成文件形式,跨平臺使用更加方便
六、MyIASM不支持外鍵約束,而InnoDB 支持外鍵約束(可實現表的聯動操做,一刪多刪)
應用場景:
一、MyIASM管理非事務表,提供高速存儲和檢索以及全文搜索能力,若是再應用中執行大量select操做,應該選擇MyIASM
二、InnoDB用於事務處理,具備ACID事務支持等特性,若是在應用中執行大量insert和update操做,應該選擇InnoDB