第一章 MySQL體系結構和儲存引擎

初夏†失忆發表於2024-06-07

1.1 定義資料庫和例項

資料庫:物理作業系統檔案或其他形式檔案型別的集合
例項:MySQL資料庫由後臺執行緒以及一個共享記憶體區組成
在MySQL資料庫中,例項與資料庫的關係通常是一一對應的,即一個例項對應一個資料庫,一個資料庫對應一個例項
MySQL資料庫例項在系統上的表現就是一個程序
MySQL讀取配置檔案的順序
/etc/my.cnf => /etc/mysql/my.cnf => /usr/local/mysql/etc/my.cnf => ~/.my.cnf
如果多個配置檔案中都有同一個引數,MySQL會以最後一個配置檔案中的引數為準
linux下,配置檔案一般放在/etc/my.cnf
windows下,配置檔案字尾名可能是cnf也可能是ini,可透過mysql--help找到類似內容

1.2 MySQL體系結構

MySQL由以下幾部分組成:
  • 連線池元件 Connectors:JDBC ODBC NET PHP Python等
  • 管理服務和工具元件 management service&utils
  • SQL介面元件
  • 查詢分析器元件
  • 最佳化器元件
  • 緩衝元件
  • 外掛式儲存引擎
  • 物理檔案
MySQL資料庫區別於其他資料庫最重要的一個特點就是其外掛式的表儲存引擎
需要注意的是,儲存引擎是基於表的,而不是資料庫

1.3 MySQL儲存引擎(瞭解)

OLTP(OnLine Transaction Processing)系統是實時事務處理系統,主要用於處理大量的隨機的、高頻率的、低複雜度的事務。OLTP系統的典型應用場景是銀行、證券、保險等金融行業,以及電商、物流等領域的業務系統。OLTP系統要求高併發、強一致性、低時延,因此通常採用關係型資料庫(如MySQL、Oracle等)作為資料儲存。
OLAP(OnLine Analytical Processing)系統是用於分析資料的系統,主要用於支援複雜的分析性查詢,提供決策支援。OLAP系統的典型應用場景是市場分析、客戶關係管理、財務分析等。OLAP系統要求支援多維度分析、靈活的查詢、自由的探索,因此通常採用資料倉儲(如Star Schema、Federated Schema等)作為資料儲存。
1.3.1 Innodb儲存引擎
Innodb儲存引擎支援事務,其設計目標主要面向線上事務處理(OLTP)的應用
特點是行鎖設計、支援外來鍵、並支援類似於Oracle的非鎖定讀,即預設讀取操作不會產生鎖
Innodb透過使用多版本併發控制(MVCC)來獲得高併發性,並實現了四種隔離級別。預設為可重複度(repeatable read)。
同時使用一種被稱為next-key locking 的策略來避免幻讀現象的產生。
除此以外,InnoDB還提供了 插入緩衝(insert buffer),二次寫(double write),自適應雜湊索引(adaptive hash index),預讀(read ahead)等高效能和高可用的功能。
對於表中的資料,InnoDB儲存引擎採用了聚集的方式,因此每張表的儲存都是按照主鍵的順序進行存放。如果沒有顯示的在表定義時指定主鍵,InnoDB儲存引擎會為每一行生成一個6位元組的ROWID,並以此作為主鍵。

1.3.2 MyISAM儲存引擎

MyISAM儲存引擎不支援事務,不支援行鎖,只支援表鎖,支援全文索引。主要面向一些OLAP的應用。
MySQL5.5.8之前MyISAM儲存引擎是預設的儲存引擎。另外,MyISAM儲存引擎另一個與眾不同的地方是它的緩衝池只快取索引檔案,而不緩衝資料檔案。
MyISAM儲存引擎表由MYD和MYI組成,MYD存放資料檔案,MYI存放索引檔案。

1.3.3 NDB儲存引擎

NDB儲存是一個叢集儲存引擎,特點是資料全部放在記憶體中,因此主鍵查詢的速度非常快,並且透過新增NDB資料儲存節點可以線性地提高資料庫效能,是高可用、高效能的叢集系統
NDB儲存引擎的連線操作是在MySQL資料庫層完成的,而不是在儲存引擎層完成的。這意味著,複雜的連線操作需要巨大的網路開銷,因此查詢速度很慢。

1.3.4 Memory儲存引擎

Memory儲存引擎將表中的資料存放在記憶體中,如果資料庫重啟或者發生崩潰,表中的資料都將丟失。適用於儲存臨時資料的臨時表 。預設使用雜湊索引,而不是B+樹索引。
Memory儲存引擎速度上非常快,但在使用上有一些限制,比如,只支援表鎖,併發效能較差,並且不支援TEXT,BLOB列型別,並且在儲存變長欄位(varchar)時是按照定長欄位(char)的方式進行的,會產生記憶體的浪費。
MySQL資料庫使用Memory儲存引擎作為臨時表來存放查詢的中間結果集,如果中間結果集大於Memroy儲存引擎表的容量設定,又或者中間結果含有TEXT或BLOB列型別欄位,則MySQL資料庫會把其轉換到MyISAM儲存引擎表而存放到磁碟中。MyISAM不快取資料檔案,因此這時產生的臨時表的效能對於查詢會有損失

1.3.5 Archive儲存引擎

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

1.3.6 Federated儲存引擎

Federated儲存引擎表並不存放資料,它只是指向一臺遠端MySQL資料庫伺服器上的表
Federated儲存引擎只支援MySQL資料庫表,不支援異構資料表

1.3.7 Maria儲存引擎

Maria儲存引擎是新開發的引擎,設計目標主要是用來取代MyISAM儲存引擎,成為MySQL的預設儲存引擎
Maria儲存引擎的特點是支援快取資料和索引檔案,應用了行鎖設計,提供了MVCC功能,支援事務和非事務安全選項,以及更好的BLOB字元型別的處理效能

1.3.8 其他儲存引擎

除了以上7中儲存引擎外,MySQL資料庫還有很多其他的儲存引擎,包括Merge、CSV、Sphinx和Infobright

1.4 連線MySQL

1.4.1 TCP/IP

TCP/IP套接字方式是MySQL資料庫在任何平臺下都提供的連線方式
命令:mysql -h address -u username -p password
在透過TCP/IP連線到MySQL例項時,MySQL資料庫會先檢查一張許可權檢視,判斷髮起請求的客戶端IP是否允許連線到MySQL例項,該檢視在MySQL架構下,表名為 user

1.4.2 命名管道和共享記憶體

在Windows 2000、Windows XP、Windoes 2003和Windows Vista以及在此之上的平臺上,如果兩個需要程序通訊的程序在同一臺伺服器上,可以使用命名管道。在MySQL資料庫中須在配置檔案中啟用--eanble-named-pipe選項
在MySQL4.1之後的版本中,MySQL還提供了共享記憶體的連線方式

1.4.3 Unix域套接字

在Linux和Unix環境下,可以透過使用Unix域套接字進行連線
Unix域套接字不是網路協議,所以只能在MySQL客戶端和資料庫例項在一臺伺服器上的情況下使用
使用者可以在配置檔案中指定套接字檔案的路徑,如--socket=/tmp/msyql.sock
當資料庫例項啟動後,透過 " show variables like 'socket' " 命令來進行Unix域套接字檔案的查詢
獲得Unix域套接字檔案後,透過 “mysql -udavid -S + 套接字檔案地址” 進行連線

相關文章