我都把MySql啃得這麼透徹了,你還不進來看一下嗎?

在數據庫中存的就是一張張有着千絲萬縷關係的表,因此表的設計的好壞,將直接影像這整個數據庫。而在設計表的時候,咱們都關注一個問題,使用什麼存儲引擎。接下來小編將重點爲你們介紹對比兩種常見的innodb和MyISAM搜索引擎~mysql

友情連接:MySQL筆記文檔算法

一 事務

一、innodbsql

  • 具備事務,支持4個事務隔離級別,其中四種隔離有:

a、Serializable (串行化):可避免髒讀、不可重複讀、幻讀的發生。數據庫

b、Repeatable read (可重複讀):可避免髒讀、不可重複讀的發生。(默認的數據庫隔離級別)緩存

c、Read committed (讀已提交):可避免髒讀的發生。安全

d、Read uncommitted (讀未提交):最低級別,任何狀況都沒法保證。服務器

  • 回滾,崩潰修復能力和多版本併發的事務安全,包括ACID事務,事務ACID指 原子性

(Atomicity)、一致性(Consistency)、隔離性(Isolation)、持久性(Durability)。markdown

二、MyISAM併發

  • 管理非事務表
  • 提供高速存儲和檢索,以及全文搜索能力

三、總結:高併發

  • 若是須要執行大量的INSERT或UPDATE操做,則應該使用InnoDB,這樣能夠提升多

用戶併發操做的性能。

  • 若是須要執行大量的SELECT查詢,那麼MyISAM是更好的選擇。

二 行級鎖和外鍵約束

mysql支持三種鎖定級別,行級、頁級、表級。其中:

表級:直接鎖定整張表,在你鎖按期間,其它進程沒法對該表進行寫操做。若是你是寫鎖,則其它進程則讀也不容許行級:僅對指定的記錄進行加鎖,這樣其它進程仍是能夠對同一個表中的其它記錄進行操做

頁級:表級鎖速度快,但衝突多,行級衝突少,但速度慢。因此取了折衷的頁級,一次鎖定相鄰的一組記錄

一、InnoDB

支持行級鎖定,可是表的行鎖也不是絕對的,若是在執行一個SQL語句時MySQL不能肯定要掃描的範圍

即 update table_name set age='24' where name like '%福%';不明確主鍵,在執行增刪改查操做時,會鎖全表

二、MyISAM

支持表級鎖定,沒有提供對數據庫事務的支持,也不支持行級鎖和外鍵,所以當INSERT(插入)或UPDATE(更新)數據時即寫操做須要鎖定整個表

三 存儲

一、InnoDB

基於磁盤的資源是InnoDB表空間數據文件和它的日誌文件,InnoDB 表的大小隻受限於操做系統文件的大小

二、MyISAM

  • 索引和數據是分開的,而且索引是有壓縮的。
  • 在磁盤上存儲成三個文件。一個是.frm文件用於存儲表的定義,一個是.MYD文件用於

存儲表的數據,另外一個是.MYI文件,存儲的是索引。操做系統對大文件的操做是比較

慢的,這樣將表分爲三個文件,那麼.MYD這個文件單獨來存放數據天然能夠優化數據

庫的查詢等操做。有索引管理和字段管理。

四 索引

一、InnoDB(索引組織表)

使用的聚簇索引、索引就是數據,順序存儲,所以能緩存索引,也能緩存數據

二、MyISAM(堆組織表)

使用的是非聚簇索引、索引和文件分開,隨機存儲,只能緩存索引

我都把MySql啃得這麼透徹了,你還不進來看一下嗎?

五 服務器數據備份

一、InnoDB

必須導出SQL來備份,LOAD TABLE FROM MASTER操做對InnoDB是不起做用的,解決方法是首先把InnoDB表改爲MyISAM表,導入數據後再改爲InnoDB表,可是對於使用的額外的InnoDB特性(例如外鍵)的表不適用。

二、MyISAM

應對錯誤編碼致使的數據恢復速度快。MyISAM的數據是以文件的形式存儲,因此在跨平臺的數據轉移中會很方便。在備份和恢復時可單獨針對某個表進行操做。

我都把MySql啃得這麼透徹了,你還不進來看一下嗎?

六 使用場景

一、InnoDB

  • 須要事務支持(具備較好的事務特性)
  • 行級鎖定對高併發有很好的適應能力,但須要確保查詢是經過索引完成
  • 常常更新的表,適合處理多重併發的更新請求
  • 數據一致性要求較高
  • 硬件設備內存較大,能夠利用InnoDB較好的緩存能力來提升內存利用率,儘量減小磁盤 IO
  • 主鍵儘量小,避免給Secondary index帶來過大的空間負擔
  • 避免全表掃描,由於會致使鎖表。(sql語句中含有where條件同時明確主鍵)
  • 儘量緩存全部的索引和數據,提升響應速度
  • 在大批量小插入的時候,儘可能本身控制事務而不要使用autocommit自動提交
  • 合理設置innodb_flush_log_at_trx_commit參數值,不要過分追求安全性
  • 避免主鍵更新,由於這會帶來大量的數據移動

二、MyISAM

  • 不須要事務支持(不支持)
  • 併發相對較低(鎖定機制問題)
  • 插入修改不頻繁,查詢很是頻繁
  • 數據一致性要求不是很是高
  • 儘可能索引(緩存機制)
  • 調整讀寫優先級,根據實際需求確保重要操做更優先
  • 啓用延遲插入改善大批量寫入性能
  • 儘可能順序操做讓insert數據都寫入到尾部,減小阻塞
  • 分解大的操做,下降單個操做的阻塞時間
  • 下降併發數,某些高併發場景經過應用來進行排隊機制
  • 對於相對靜態的數據,充分利用Query Cache能夠極大的提升訪問效率
  • MyISAM的Count只有在全表掃描的時候特別高效,帶有其餘條件的count都須要進行實際的數據訪問

七 Innodb和MyIASM的引擎原理

一、Innodb

  • 引擎的索引結構,使用B+Tree做爲索引結構
  • InnoDB的數據文件自己就是索引文件,數據文件自己就是按B+Tree組織的一個索引

結構,這棵樹的葉節點data域保存了完整的數據記錄,這種索引就是彙集索引。

  • 主鍵索引:

a、由於InnoDB的數據文件自己要按主鍵彙集,因此InnoDB要求表必須有主鍵(MyISAM能夠沒有)。

b、若是沒有顯式指定,則MySQL系統會自動選擇一個能夠惟一標識數據記錄的列做爲主鍵。

c、若是不存在惟一標識數據記錄的列,則MySQL自動爲InnoDB表生成一個隱含字段做爲主鍵,這個字段長度爲6個字節,類型爲長整形。

我都把MySql啃得這麼透徹了,你還不進來看一下嗎?

  • 輔助索引

InnoDB的輔助索引data域存儲相應記錄主鍵的值而不是地址即InnoDB的全部輔助索引都引用主鍵做爲data域

我都把MySql啃得這麼透徹了,你還不進來看一下嗎?

二、MyIASM

  • 引擎的索引結構:使用B+Tree做爲索引結構
  • MyISAM索引實現:

MyISAM索引文件和數據文件是分離的,索引文件僅保存數據記錄的地址,即葉節點的data域存放的是數據記錄的地址

  • 索引檢索的算法:

首先按照B+Tree搜索算法搜索索引,若是指定的Key存在,則取出其data域的值,而後以data域的值爲地址,讀取相應數據記錄。

  • 主鍵索引和輔助索引(結構上沒有任何區別,只是主索引要求key是惟一的,而輔助索引的key能夠重複)

我都把MySql啃得這麼透徹了,你還不進來看一下嗎?

三、注意

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

MyISAM表中,能夠和其餘字段一塊兒創建聯合索引。

  • InnoDB 中不保存表的具體行數,也就是說,執行select count() fromtable時,

InnoDB要掃描一遍整個表來計算有多少行,可是MyISAM只要簡單的讀出保存好的行

數便可。注意的是,當count()語句包含where條件時,兩種表的操做是同樣的

相關文章
相關標籤/搜索