存儲引擎

簡介

Mysql創(chuàng)建、查詢、更新和刪除數(shù)據(jù)操作都依賴于存儲引擎,不同的存儲引擎提供不同的存儲機制、索引技巧、鎖定水平等功能,使用不同的存儲引擎獲得額外的速度或者功能。

主要存儲引擎

查看mysql(5.7)支持的存儲引擎

通過show engines;命令可以看到:

image

mysql支持InnoDB(Mysql5.5.5,之后默認的存儲引擎),MyISAM,MRG_MYISAM,MEMORY,ARCHIVE,CSV,BLACKHOLE等存儲引擎。

修改存儲引擎

  • 全局修改配置文件my.cnf(永久):default-storage-engine=CSV
  • 全局命令修改(臨時,重啟后失效):SET default_storage_engine=CSV;
  • 修改某個表:ALTER TABLE 表名 ENGINE = CSV;

主要存儲引擎對比

MYISAM

MyISAM是MySQL5.5.8之前默認儲存引擎。

  • 文件格式:
    • 表定義:*.frm;
    • 表數(shù)據(jù)文件:*.MYD;
    • 表索引文件:*.MYI;
  • 優(yōu)點:
    • 只緩存索引,占用內存少;
    • 精確記錄表行數(shù),count查詢速度極快;
    • 鎖級別為表鎖,表鎖優(yōu)點是開銷小,加鎖快;
    • 可被壓縮,存儲空間較小
  • 缺點:
    • 不支持事務;
    • 不支持外鍵;
    • 表鎖粒度大,發(fā)生鎖沖動概率較高,并發(fā)能力低;
    • 宕機后,MyISAM表易損壞,災難恢復性差

適用場景:

  • 做很多count的計算;
  • 并發(fā)不高;
  • 極少修改,例如存儲用戶登錄日志;
  • 不需要事務的;
  • 數(shù)據(jù)安全要求低。

INNODB(推薦)

INNODB是MySQL5.5.8版本開始就是默認儲存引擎,適用絕大多數(shù)場景。

  • 文件格式:
    • 表定義:*.frm;
    • 表數(shù)據(jù)、索引文件:*.ibd;
  • 優(yōu)點:
    • 支持事務;
    • 支持外鍵;
    • 可靠性高,災難恢復性好;
    • 使用行級鎖,支持mvcc,并發(fā)能力強;
    • 默認RR隔離級別,提供next-key loking避免幻讀;
    • 緩存數(shù)據(jù)和索引,還提供變更緩沖,二次寫,自適應哈希索引等高效的緩存特性;
  • 缺點:
    • 服務器資源開銷大;
    • 不記錄表行數(shù),count查詢會做全表掃描;

適用場景:

  • 頻繁修改,并發(fā)要求高;
  • 支持事務,外鍵;
  • 數(shù)據(jù)安全要求高。

MEMORY

也叫HEAP存儲引擎,數(shù)據(jù)存儲在內存,如果MySQL服務重啟數(shù)據(jù)會丟失,但是表結構會保存下來。

  • 優(yōu)點:
    • 由于數(shù)據(jù)存儲在內存,顯著提高訪問性能;
  • 缺點:
    • 不支持事務;
    • 不支持外鍵;
    • 表鎖粒度大,發(fā)生鎖沖動概率較高,并發(fā)能力低;
    • 所有字段都為固定長度,不支持 BLOB 和 TEXT 等大字段
    • 服務重啟數(shù)據(jù)會丟失,不支持災難恢復

適用場景:

  • 小表,查詢性能要求高;
  • 臨時表;

ARCHIVE

Archiv存儲引擎,只支持insert和select操作,不支持索引,主要用于數(shù)據(jù)歸檔。

  • 文件格式:
    • 表定義:*.frm;
    • 表數(shù)據(jù)文件:*.arz;
  • 優(yōu)點:
    • 只允許插入和查詢,不允許修改和刪除,可以實現(xiàn)高并發(fā)的插入;
    • 用zlib對表的數(shù)據(jù)進行壓縮,相比MyISAM會更加節(jié)約磁盤IO,數(shù)據(jù)量大時,依然較好的插入性能。
  • 缺點:
    • 功能單一,只是提供高速的插入和壓縮功能;

適用場景:日志和數(shù)據(jù)采集類應用

詳細的存儲引擎對比表

特點 MYISAM INNODB MEMORY ARCHIVE
存儲限制 64TB
事務
鎖機制 表鎖 行鎖 表鎖 行鎖
外鍵
MVCC
B-Tree索引
Hash索引
全文索引
集群索引
數(shù)據(jù)緩存
索引緩存
數(shù)據(jù)壓縮
存儲空間 N/A 非常低
內存空間 中等
批量寫入效率 非常高
復制
備份/時間點恢復
地理信息

總結

絕大多數(shù)場景下,使用默認INNODB都是正確的選擇。除非需要用到某些INNODB不具備的特性,并且沒有其他辦法可以代替,那可以考慮使用其他存儲引擎。

除非萬不得已,否則不建議混合使用多種存儲引擎,不然可能會帶來一系列復雜的問題,以及一些潛在的bug和邊界問題,例如在一個事務里面同時,插入兩張表A(MYISAM)、B(INNODB)數(shù)據(jù),表A數(shù)據(jù)先插入成功,接著表B插入失敗回滾,就無法保證數(shù)據(jù)一致性了。混合存儲對一致性備份和服務器參數(shù)配置也帶來了一些麻煩。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容