1. 程式人生 > 實用技巧 >MySQL儲存引擎對比

MySQL儲存引擎對比

一.MySQL的儲存引擎

  大家應該知道MySQL的儲存引擎應該是表級別的概念,因為我們無法再建立database時指定儲存引擎,而是隻能在建立表的時候可以明確指定使用哪種儲存引擎。因此儲存引擎也通常被稱作“表型別”。也就是說,儲存引擎是負責跟檔案系統真正資料打交道的工具,它卻決定了表中是如何儲存資料的,不用儲存引擎他們指出的工作特性是各不相同的。所以,我們在工作時應該選擇時候適合自己的儲存引擎。 1>.檢視MySQL支援的所有儲存引擎
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null
storage engine (anything you write to it disappears) | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 9
rows in set (0.01 sec)
2>.檢視某張表的儲存引擎   使用格式: SHOW TABLE STATUS [{FROM | IN} db_name] [LIKE 'pattern' | WHERE expr]
mysql> show table status in chensiting like 'students'\G               #我們可以用like來過濾
*************************** 1. row ***************************
           Name: students                                          
-------->表名 Engine: InnoDB ------->儲存引擎 Version: 10 -------->版本 Row_format: Compact -------->行格式 Rows: 8 -------->現存表中的行數,對於InnoDB的儲存引擎的話這個數字可能只是一個估計值,因為innodb支援事物,其中還儲存著刪除的行數。 Avg_row_length: 2048 --------->平均每行所包含的位元組數 Data_length: 16384 --------->表中資料總體大小,單位是位元組 Max_data_length: 0 --------->表能夠佔用的最大空間,單位為位元組。注意,“0”則表示沒有上線喲! Index_length: 16384 --------->索引的大小,單位也是位元組 Data_free: 0 ---------->對於MyISAM表,表示已經分配但尚未使用的空間,其中包含此前刪除行之後騰出來的空間。 Auto_increment: 13 ---------->下一個AUTO_INCREMENT的值 Create_time: 2020-11-21 04:11:46 ----------->表的建立時間 Update_time: NULL ----------->表資料的最後一次修改時間 Check_time: NULL ------------>使用CHECK TABLE或myisamchk最近一次檢查表的時間 Collation: utf8_general_ci ------------->排序規則 Checksum: NULL ------------->如果啟動,則為表的checksum Create_options: ------------->建立表時指定使用的其他選項 Comment: ------------->表的註釋資訊 1 row in set (0.00 sec) mysql> show table status in chensiting where name='students'\G #當然用where查詢的效能會更好 *************************** 1. row *************************** Name: students Engine: InnoDB Version: 10 Row_format: Compact Rows: 8 Avg_row_length: 2048 Data_length: 16384 Max_data_length: 0 Index_length: 16384 Data_free: 0 Auto_increment: 13 Create_time: 2020-11-21 04:11:46 Update_time: NULL Check_time: NULL Collation: utf8_general_ci Checksum: NULL Create_options: Comment: 1 row in set (0.00 sec)

3>.行格式

  MySQL的行格式有:
    {DEFAULT|DYNAMIC|FIXED|COMMPRESSED|REDUNDANT|COMPACT},
    
  其中DYNAMIC|FIXED|COMMPRESSED是MyISAM常用的的,而InnoDB即可以使用MyISAM常用的型別還可以使用REDUNDANT|COMPACT等等。

二.MyISAM和InnoDB的儲存引擎對比

1>.什麼是表空間(table space)
它是由InnoDB管理的特有格式資料檔案,內部可同時儲存資料和索引

2>.MyISAM資料儲存結果

 MySQL的每個表都在資料庫目錄下儲存三個檔案,名稱如下:
    a>.tb_name.frm #儲存表結構
    b>.tb_name.MYD #儲存資料
    c>.tb_name.MYI #儲存索引

3>.InnoDB

  Innodb有兩種格式:
    a>.innodb_file_per_table=OFF,即是用共享表空間
      每個表一個獨有的格式定義檔案:tb_name.frm
      還有一個預設位於資料目錄下的共享的表空間檔案:ibdata#(它是會自動增長的,比如ibdata1,ibdata2,...)
    b>.innodb_file_per_table=ON,即是用獨立表空間
      每個表在資料庫目錄下儲存兩個檔案
        tb_name.frm #儲存表結構
        tb_name.ibd #儲存資料

4>.修改預設的儲存引擎

通過default_storage_engine服務變數實現。可以用mysql> show variables like '%default%'來檢視相應的資訊

三.MySQL各儲存引擎的特性

1>.InnoDB儲存引擎
  a>.支援事務:
      有事務日誌,這些事物日誌檔案的大小是一致的喲!):ib_logfile#(例如:ib_logfile0,ib_logfile1,....);
  b>.支援外來鍵約束;
  c>.支援MVCC(多版本併發控制);
  d>.支援聚簇索引:
      聚簇索引之外的其他索引,通常稱之為輔助索引,一張表聚簇索引只能有一個而輔助索引可以有多個。聚簇索引通常是用主鍵的方式來實現,(因為主鍵的資料是不允許重複的);
  e>.行級鎖:間隙鎖;
  f>.支援使用輔助索引;
  g>.支援自適應的hash索引;
  h>.支援熱備份,因此資料不需要離線就可以完成備份啦,當然可能要用獨立表空間;

2>.MyISAM

MyISAM的使用場景:
    只讀資料,表較小,能夠忍受崩潰後的修復操作和資料丟失,它具有一下特點:
      a>.全文索引
      b>.支援表壓縮存放:做資料倉庫,能節約儲存空間並提升效能
      c>.支援空間索引
      d>.表級鎖
      e>.延遲更新索引
      f>.不支援事務、外來鍵和行級鎖
      g>.崩潰後無法安全恢復資料
  MySQL的mysql庫使用就是MyISAM儲存引擎,我們可以使用“mysql> show table status in mysql\G”進行檢視。

3>.ARCHIVE(歸檔)

僅支援INSERT和SELECT,支援很好壓縮功能。應用於儲存日誌資訊,或其他按照時間序列實現的資料採集類的應用。它不支援事物,不能很好的支援索引

4>.CSV

將資料儲存為CSV格式,不支援索引,僅使用與資料交換場景。說白了就是可以在多種不同的資料庫之間來回匯入匯出資料庫的。也就是說我們可以將office的文件儲存為CSV就可以直接向MySQL資料庫匯入;

5>.BLACKHOLE

又名黑洞儲存引擎,沒有儲存機制,任何發往次引擎的資料都會丟棄,其會記錄二進位制日誌,因此,常用於多級複製架構中作中轉伺服器

6>.MEMORY

儲存資料在記憶體中,它是一個記憶體表(也就是說重啟作業系統之後就會丟失該表的資料喲!);常用於儲存中間資料,如週期性的聚合資料等,也用於實現臨時表,支援hash索引,使用表級鎖,不支援BLOB和TEXT資料型別。

7>.MRG_MYISAM

是MYISAM的一個變種,能夠將多個MyISAM表合併成一個虛表。它是傳統的MySQL儲存引擎,現在基本上很少有人用了,因為一個表的資料內容本來就很大了,人們更多考慮的是如何將一張表的內容如何拆分開來。

8>NDB

是MySQL CLUSTER中專用的儲存引擎。它是叢集用的一種儲存引擎,但是這種叢集案例用的幾乎寥寥無幾

四.第三方的儲存引擎

1>.線上儲存引(簡稱,OLPT),常見的有以下三種:
  XtraDB
    它是增強的InnoDB,有Percona提供。
    編譯安裝時,下載XtraDB的原始碼替代MySQL儲存引擎中的InnoDB的原始碼(當然你得把XtraDB的名稱改為InnoDB喲)
  PBXT:
    MariaDB自帶此儲存引擎
    支援引擎級別的複製、外來鍵約束,對SSD磁碟(固態磁碟)提供適當支援,當然也支援事務和MVCC等等。
  TokuDB:
    使用 Fractal Trees索引,適用儲存大資料,擁有很好的壓縮比,已經被引入MariaDB。

2>.按照列式資料儲存引擎分為以下幾種4種:

  Infobright
    目前較有名的列式引擎,適用於海量資料儲存場景,如PB級別,專為資料分析和資料倉庫設計,分為商業版本和社群版本,其他三個都不是特別有名。
  InfiniDB
  MonetDB
  LucidDB

3>.按照開源社群儲存引擎分為以下幾種:

  Aria:
    前身為Maria,是增強版的MyISAM(支援崩潰後安全恢復,支援資料快取)
  Groona:
    全文索引引擎
  Mroonga:
    是基於Groona的二次開發版
  OQGraph:
    由open query研發,支援圖(網狀 )結構的儲存引擎
  SphinxSE:
    為Sphinx全文搜尋伺服器提供了SQL介面
  Spider:
    能將資料切分成不同的分片,比較高效透明的實現了分片(shared),並支援在分片上支援並行查詢

五.如何選擇合適的儲存引擎

  我們一般從以下幾個維度衡量:     1>.是否需要事務;     2>.備份的型別的支援;     3>.崩潰後的恢復;     4>.特有的特性;