1. 程式人生 > 實用技巧 >MySQL體系結構——儲存引擎

MySQL體系結構——儲存引擎

MySQL的組成部分:

  • 連線池元件
  • 管理服務和工具元件
  • SQL介面元件
  • 查詢分析器元件
  • 優化器元件
  • 緩衝元件(cache)
  • 外掛式儲存引擎(相比其他資料庫比較大的區別)
  • 物理檔案

儲存引擎是底層物理結構的實現,每個儲存引擎的開發者可以按照自己的意願來開發

儲存引擎是基於表的,而不是資料庫。

MySQL的儲存引擎

MySQL資料庫獨特的外掛式儲存引擎結構,每個儲存引擎都有自己的特點,能夠根據不同的應用建立不同儲存引擎的表。MySQL開源特性使得使用者可以根據自己MySQL預定義的儲存引擎介面來編寫自己的儲存引擎。如果對於某一功能不滿意可以修改原始碼來得到我們想要的特性。

1) Innodb儲存引擎

Innodb儲存引擎支援事務,其設計的目標主要面向線上事務處理(OLTP)的應用。特點是行鎖設計,支援外來鍵,並支援非鎖定讀,從MySQL5.5.8開始,InnoDB引擎成為MySQL的預設儲存引擎。

InnoDB儲存引擎將資料儲存在一個邏輯的表空間中,這個表空間像黑盒一樣由Innodb本身進行管理,從MySQL4.1版本開始,將InnoDB儲存引擎的表存放到一個獨立的ibd檔案中,InnoDB引擎支援raw block來建立表空間。

InnoDB通過使用多版本併發控制(MVCC)來獲得高併發性,並且實現了SQL標準的4種隔離級別,預設RR

mysql> select @@transaction_isolation;
+-------------------------+
| @@transaction_isolation |
+-------------------------+
| REPEATABLE-READ         |
+-------------------------+
1 row in set (0.00 sec)

同時使用next-key locking 的策略避免幻讀的現象。

除此之外,InnoDB還提供了插入快取(insert buffer),二次寫(double write),自適應雜湊索引(adaptive hash index),預讀(read head)等高效能和高可用功能。

表中資料的儲存,InnoDB採用了聚集(clustered)的方式,因此每張表都按照主鍵的順序進行存放。如果沒有顯示的在表定義時指定主鍵,InnoDB儲存引擎會為每一行生成一個6位元組的ROWID,並以此作為主鍵。

2) MyISAM儲存引擎

MyISAM儲存引擎不支援事務、表鎖設計,支援全文索引,主要面向一些OLAP資料庫應用。在MySQL5.5.8版本之前MyISAM是預設的儲存引擎。MyISAM儲存引擎與其他引擎比較不同的 地方是它的緩衝池只快取索引檔案,而不快取資料檔案。

MyISAM儲存引擎表由MYD和MYI組成,MYD用來存放資料檔案,MYI用來存放索引檔案。可以使用myisampack來對資料檔案進行壓縮和解壓。但是經過壓縮的表是隻讀的。

MySQL5.0以前MyISAM支援單表大小為4G,更大需要指定隱藏屬性規則。MySQL5.0以後預設支援256TB單表資料。

3) NDB儲存引擎

NDB儲存引擎是一個叢集儲存引擎,類似於Oracle RAc,不過與Oracle RAC share everything 不同的是,這個引擎的結構是share nothing,因此可以提供更高的可用性。NDB的特點是全部存放在記憶體中(從MySQL5.1開始可以將非索引資料放在磁碟上)因此這個引擎的主鍵查詢速度極快。並且通過新增NDB資料節點(Data Node)可以線性的提高資料庫的效能,是最高可用、高效能的集群系統。注意,NDB儲存引擎的join操作是在MySQL的資料庫層完成的而不是儲存引擎層完成的。這也意味著複雜的連續操作需要巨大的網路開銷,因此查詢速度很慢。

4) Memory儲存引擎

Memory儲存引擎,以前被稱為HEAP儲存引擎,將表中的資料存放在記憶體中,如果資料庫發生重啟或者崩潰,表中的資料將會消失,它非常適用於存放臨時表,以及資料倉庫中的緯度表。Memory儲存引擎預設使用hash索引,而不是B+tree。

Memory儲存引擎速度非常快,但是使用上有很大的限制。只支援表鎖,併發效能比較差,不支援Text,BLOB資料型別。還有一個問題,當MySQL使用Memory儲存引擎作為臨時表來存放查詢的中間結果集。如果中間結果集大於Memory儲存引擎表的容量或者這個結果集中間存在Text,BLOB欄位,MySQL會將其轉換成MyISAM儲存引擎表來存放到磁碟上,MyISAM儲存引擎並不會快取資料檔案,因此這時產生的臨時表的效能對查詢而言並不好。

5)Archive儲存引擎

Archive儲存引擎只支援INSERT和SELECT操作,從MySQL5.1開始支援索引。Archive儲存引擎使用Zlib演算法將資料行(row)進行壓縮後儲存,壓縮比一般可達1:10。Archive儲存引擎非常適合儲存歸檔資料,比如日誌資訊。使用行鎖來實現高併發的插入操作,但本身並不是事務安全的儲存引擎,其設計的主要目的是提高高速插入和壓縮功能。

6)Federated儲存引擎

Federated儲存引擎表並不存放資料,它只是指向一臺遠端的MySQL伺服器上的表,這非常類似於SQL server上的連結伺服器和Oracle中的透明閘道器,不同的是這個引擎只支援MySQL資料表,而不支援其他異構資料庫表。

7)Maria儲存引擎

Maria儲存引擎是新開發的儲存引擎,目標是取代原本的MyISAM引擎,設計者也是MySQL的創始人之一。可以看作是MyISAM的後續升級版本,這個引擎在MyISAM上做出了很多的優化,它的特點是支援快取資料和索引檔案,應用了行鎖設計,提供了MVCC功能,支援事務和非事務的安全選項,以及更好的BLOB字元型別的處理效能。

8)其他儲存引擎

MySQL還有很多儲存引擎,如Merge,CSV,Sphinx和InfoBright。不同的引擎都有各自適合的場景。

問題:

[] 哪些MySQL儲存引擎支援全文索引?

MyISAM,InnoDB,Sphinx儲存引擎都支援全文索引

[]MySQL資料庫快是否是因為它不支援事務?

不是的,雖然MySQL的MyISAM不支援事務,但是InnoDB是支援的。而快這個概念也應該是針對不同的場景而言的,對於ETL這種操作當然是MyISAM更有優勢,但在OLAP環境中,InnoDB引擎的效率會更好。

[]資料量超過1000萬,MySQL的效能會急劇下降?資料庫隨著資料行數的增加效能都會有所下降,但不是線性的,選擇正確的引擎和正確的配置再多的資料量MySQL也是可以承受的。

各儲存引擎之間的比較:

與引擎相關的查詢:

查詢當前資料庫支援哪些引擎:

mysql> show engines\G
*************************** 1. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 2. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
*************************** 4. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 7. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
9 rows in set (0.00 sec)


來自為知筆記(Wiz)