MySQL存儲引擎對比——MyISAM,InnoDB,MEMORY

MyISAM存儲引擎

MyISAM在磁盤上存儲三個文件,文件名和對應表名一致。

  • frm文件:存儲表的定義數據。
  • MYD文件:存放表具體記錄數據。
  • MYI文件:存儲索引。

MyISAM引擎特點

  1. 不支持事務(事務是指邏輯上的一組操作,組成這組操作的各個單元,要麼全成功,要麼全失敗)
  2. 表級鎖定,不支持行級鎖。(更新時鎖整個表):雖然讓鎖定的實現成本很小,但同時大大降低併發能力。
  3. 讀寫互相阻塞:不僅會在寫入的時候阻塞讀取,MyISAM還會在讀取的時候阻塞寫入,但讀本身並不會阻塞另外的讀。
  4. 只會緩存索引:MyISAM可以通過key_buffer_size緩存索引,以大大提高訪問性能,減少磁盤IO,但這個緩存區只會緩存索引,而不會緩存數據。也就是說MyISAM引擎的數據緩存是個問題。
  5. 讀取速度較快,佔用資源較少。
  6. 不支持外鍵約束,但支持全文索引。
  7. MyISAM引擎是MySQL5.5.5前缺省的存儲引擎。

MyISAM表的存儲格式

  • 靜態(固定長度)表:定義的表列的大小是固定的,所有字段都是固定非變長的字段(即不含有:xblob、xtext、varchar等長度可變的數據類型)。這樣每個記錄都是固定長度。速度非常快,表缺損易恢復。但浪費空間。
  • 動態可變長度表:如果列(即使只有一列)定義爲動態的(xblob, xtext, varchar等數據類型),這時myisam就自動使用動態型,雖然動態型的表佔用了比靜態型表較少的空間,但帶來了性能的降低,因爲行變化如果很大的話,會被分成碎片。隨着碎片增加,數據訪問性能就會相應的降低。同時表缺損後恢復比靜態格式要更加困難。
    對於因爲碎片的原因而降低數據訪問性,有兩種解決辦法:
    1、儘可能使用靜態數據類型
    2、經常使用optimize table語句,他會整理表的碎片,恢復由於表的更新和刪除導致的空間丟失。
    (如果存儲引擎不支持 optimize table 則可以轉儲並重新加載數據,這樣也可以減少碎片)——摘自(https://blog.csdn.net/QH_JAVA/article/details/14045827
  • 壓縮表:MyIsam存儲壓縮表需要的磁盤存儲空間最小,數據庫系統提供了myisampack工具可以用來壓縮MyISAM表,每行單獨壓縮,每列的壓縮也不一樣

MyISAM引擎適用的生產業務場景

  • 不需要事務支持的業務(例如轉賬, 支付)
  • 一般爲讀數據比較多是應用,讀寫都頻繁場景不適合(因爲會互相阻塞),讀多或者寫多的都適合。
  • 數據修改相對較少的業務(阻塞問題)。
  • 以讀爲主的業務,例如新聞網站, blog, 圖片信息數據庫, 用戶數據庫等。
  • 對數據一致性要求不是非常高的業務。(因爲不支持事務,沒法保證高一致性)
  • 硬件資源比較差的機器

MyISAM引擎調優精要

  • 設置合適的索引(緩存機制),選擇重複值少的列作爲索引。
  • 調整讀寫優先級根據實際需求確保重要操作更優先執行。(一般都是寫優先)
  • 啓用延遲插入,改善大批量寫入性能(降低寫入頻率,儘可能多條數據一次性寫入)。
  • 儘量順序操作,讓insert數據都寫入到尾部,減少阻塞。
  • 分解大的時間長的操作,降低單個操作的阻塞時間。(就像CPU分片一樣)。
  • 降低併發數(減少對MySQL訪問),某些高併發場景通過應用進行排隊。

    InnoDB存儲引擎

    InnoDB在磁盤上存儲一個文件ibdatal

    InnoDB存儲引擎特點

    關鍵字:支持事務,行級鎖, 外鍵

    1. 支持事務,支持4個事務隔離級別,支持多版本讀。
    2. 行級鎖定(更新時一般是鎖定當前行):通過索引實現,如果沒建立索引,全表掃描仍然會是表鎖,這樣就和MyISAM沒有區別了。例如:
      在執行一個SQL語句時MySQL不能確定要掃描的範圍,InnoDB表會鎖全表,例如update table set num=1 where name like “a%”
    3. 讀寫阻塞與事務隔離級別相關。
    4. 具有非常高效的緩存特性:能緩存索引,也能緩存數據。
    5. 整個表和主鍵以Cluster方式存儲,組成一顆平衡樹。
    6. 所有Secondary Index都會保存主鍵信息。
    7. 支持分區,表空間,類似oracle數據庫。
    8. 支持外鍵約束,不支持全文索引(5.5以前),以後支持了。
    9. InnoDB對硬件資源要求比較高。
    10. innodb存儲引擎索引使用的是B+Tree

InnoDB引擎使用的生產業務場景

  • 需要事務支持的業務(因爲具有較好的事務特性)
  • 行級鎖定對高併發有很好的適應能力,但需要確保查詢是通過索引完成,否則還是表鎖。
  • 數據讀寫及更新都較爲頻繁的場景,如:BBS, SNS, 微博,微信(當然大多會用nosql來處理這些問題)等。
  • 數據一致性要求較高的業務,例如:充值轉賬,銀行卡轉賬。
  • 硬件設備內存較大,可以利用InnoDB較好的緩存能力來提高內存利用率,儘可能減少磁盤IO。

InnoDB引擎調優

  • 主鍵儘可能小,避免給Secondary index帶來過大的空間負擔
  • 避免全表掃描,因爲會導致使用表鎖。
  • 儘可能緩存所有的索引和數據,提高響應速度,減少磁盤IO消耗。
  • 在大批量小插入的時候,儘量自己控制事務而不要使用autocommit自動提交。
  • 合理設置innodb_flush_log_at_trx_commit參數值,不要過度追求安全性。如果innodb_flush_log_at_trx_commit的值爲0,log buffer 每秒就會被刷寫日誌文件到磁盤,提交事務的時候不做任何操作。
  • 避免主鍵更新,因爲這會帶來大量的數據移動。

MEMORY存儲引擎

MEMORY引擎特點

每個基於memory存儲引擎的表對應一個.frm格式的磁盤文件。該文件中只存儲表的結構。而其數據文件,都是存儲在內存中。MEMORY默認使用哈希索引。速度比使用B型樹索引快。把數據存到內存中,如果內存出現異常就會影響數據。如果重啓或者關機,所有數據都會消失。所以只能存儲揮發型數據。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章