1. 程式人生 > >MySQL儲存與引擎

MySQL儲存與引擎

儲存引擎,表處理器,表型別;

參考部落格:1 2

文章目錄

引擎

MySQL提供不同的引擎型別,對不同的表進行儲存和管理。表的儲存到資料庫中,最後落入檔案或者記憶體、或者根據不同的業務是否需要事務管理,或者支援的索引等等功能,選擇不同的儲存引擎,滿足不同的效率要求等。

不同的儲存引擎提供額外的效率、功能等,對不同需求的表進行管理儲存,提升不同的效益。

可以選擇適用不同伺服器、資料庫和表格的儲存引擎。在選擇怎麼儲存(記憶體?檔案),怎麼索引(全文?雜湊?其他?),存什麼樣的資料(文字?csv?),支不支援聯機事務處理等;提供不同的需求,不同的效能和靈活性。

資料庫引擎是用於儲存、處理和保護資料的核心服務。儲存引擎說白了就是如何儲存資料、如何為儲存的資料建立索引和如何更新、查詢資料等技術的實現方法。

型別

  • InnoDB
  • MyISAM
  • MRG_MYISAM
  • MEMORY
  • CSV
  • ARCHIVE
  • BLACKHOLE
  • PERFORMANCE_SCHEMA
  • FEDERATED

操作

  1. 檢視

    • SHOW VARIABLES LIKE '%storage_engine%

    • SHOW ENGINES\G;

    • INFORMATION_SCHEMA.ENGINES表

  2. 修改

    • 安裝環境的配置 my.cnf -----修改預設儲存引擎欄位
    • 建立表/修改表/時:CREATE TABLE XX ...ENGINE=InnoDB
    • 檢視:show create table xx
  3. 其他

InnoDB

MySQL預設的儲存引擎(V5.6之後)。一個健壯的事務型儲存引擎------操作非常大的資料量,提供行級鎖定外來鍵約束。一般來說,如果需要事務支援,並且有較高的併發讀取頻率,InnoDB是不錯的選擇。

特點

  • 提供ACID的事務性支援,實現了四種隔離級別(無操作、髒讀、重複讀、幻度)。
  • 行級鎖定和外來鍵約束,滿足處理大容量資料庫系統的目標
  • 從V5.6開始支援全文索引
  • 系統崩潰後可以自動恢復
  • 外來鍵和引用完整性支援,包括級聯刪除和更新; 基於行級別的鎖定和多版本化,良好的併發效能

適用:

  • 經常更新的表,適合多重併發請求
  • 事務操作
  • 自動災難恢復。與其它儲存引擎不同,InnoDB表能夠自動從災難中恢復。
  • 外來鍵約束
  • 列自增,auto_increment

MyISAM

MyISAM表是獨立於作業系統的,可以輕鬆地將其從Windows伺服器移植到Linux伺服器;每當我們建立一個MyISAM引擎的表時,就會在本地磁碟上建立三個檔案,檔名就是表名。例如,我建立了一個MyISAM引擎的tb_Demo表,那麼就會生成以下三個檔案:tb_demo.frm,儲存表定義;tb_demo.MYD,儲存資料;tb_demo.MYI,儲存索引。

如果表的讀操作遠遠多於寫操作且不需要資料庫事務的支援,那麼MyIASM也是很好的選擇。

特點

  • 不支援事務,沒有行級鎖和外來鍵-----插入和更新操作會鎖定全表,效能低
  • 使用一種表格鎖定機制,實現併發(犧牲空間)
  • 強調快速讀取,不支援災難恢復

適用:

  • 選擇密集的表:篩選大量資料時效能優
  • 更新密集的表:MyISAM的併發插入特性允許同時選擇和插入資料。例如:MyISAM儲存引擎很適合管理郵件或Web伺服器日誌資料。

MRG_MyISAM

是一個相同的可以被當作一個來用的MyISAM表的集合,所有的表有同樣的列(名字、型別)和索引資訊。和舊版本的MERGE 是同一種來源。對一個MERGE表操作其實就是對其中的MyISAM表進行操作。

適用:

  • 伺服器日誌,多個相同表的資料
  • MERGE表是在MyISAM表的基礎上進行定義的,就如同檢視那樣;刪除不會影響原表資料。alter table tb_merge engine=merge union(tb_log1) insert_method=last;
  • 上述定義中,union表示關聯哪些表,insert_method 表示插入資料的方法,取值域為[0,FIRST,LAST];分別表示不允許插入、插入第一個表和插入最後一個表

MEMORY

在記憶體中建立表,效能高。要求儲存在表中的資料使用的是長度不變的格式,預設使用Hash索引。

特點:

  • 訪問存取效率高,記憶體訪問
  • 資料容易丟失,關機則失去
  • 支援雜湊索引和B樹索引
  • [Added]B樹索引的優於雜湊索引的是,可以使用部分查詢和通配查詢,也可以使用<、>和>=等操作符方便資料探勘。雜湊索引進行“相等比較”非常快,但是對“範圍比較”的速度就慢多了,因此雜湊索引值適合使用在=和<>的操作符中,不適合在<或>操作符中,也同樣不適合用在order by子句中。

適用:

  • 目標資料較小,頻繁訪問使用的資料(類似快取機制);可以通過引數max_heap_table_size控制Memory表的大小
  • 臨時資料
  • 資料丟失對使用環境沒有影響

BLACKHOLE

任何寫入到此引擎的資料均會被丟棄掉, 不做實際儲存;Select語句的內容永遠是空。他會丟棄所有的插入的資料,伺服器會記錄下Blackhole表的日誌,所以可以用於複製資料到備份資料庫。

適用:

  • 充當日誌伺服器
  • 驗證dump file語法的正確性??

ARCHIVE

Archive是歸檔的意思,在歸檔之後很多的高階功能就不再支援了,僅僅支援最基本的插入和查詢兩種功能。在MySQL 5.5版以前,Archive是不支援索引,但是在MySQL 5.5以後的版本中就開始支援索引了。Archive擁有很好的壓縮機制,它使用zlib壓縮庫,在記錄被請求時會實時壓縮,所以它經常被用來當做倉庫使用。

特點:

  • 行級鎖,不支援事務

小結&對比

【表參考連結:https://github.com/jaywcjlove/mysql-tutorial/blob/master/chapter3/3.5.md】

特性 InnoDB MyISAM MEMORY ARCHIVE
儲存限制(Storage limits) 64TB No YES No
支援事物(Transactions) Yes No No No
鎖機制(Locking granularity) 行鎖 表鎖 表鎖 行鎖
B樹索引(B-tree indexes) Yes Yes Yes No
T樹索引(T-tree indexes) No No No No
雜湊索引(Hash indexes) Yes No Yes No
全文索引(Full-text indexes) Yes Yes No No
叢集索引(Clustered indexes) Yes No No No
資料快取(Data caches) Yes No N/A No
索引快取(Index caches) Yes Yes N/A No
資料可壓縮(Compressed data) Yes Yes No Yes
加密傳輸(Encrypted data[1]) Yes Yes Yes Yes
叢集資料庫支援(Cluster databases support) No No No No
複製支援(Replication support[2]) Yes No No Yes
外來鍵支援(Foreign key support) Yes No No No
儲存空間消耗(Storage Cost) N/A 非常低
記憶體消耗(Memory Cost) N/A
資料字典更新(Update statistics for data dictionary) Yes Yes Yes Yes
備份/時間點恢復(backup/point-in-time recovery[3]) Yes Yes Yes Yes
多版本併發控制(Multi-Version Concurrency Control/MVCC) Yes No No No
批量資料寫入效率(Bulk insert speed) 非常快
地理資訊資料型別(Geospatial datatype support) Yes Yes No Yes
地理資訊索引(Geospatial indexing support[4]) Yes Yes No Yes