一、MySQL體繫結構和存儲引擎 儘管各個平臺在底層(如線程)實現方面都各不相同,但MySQL基本上能保證在各個平臺上的物理結構的一致性。因此,用戶應該能很好的理解MySQL資料庫在所有這些平臺是如何運作的。 1.1 定義資料庫和實例 資料庫:物理操作系統文件或其他形式文件類型的集合。在MySQL數 ...
一、MySQL體繫結構和存儲引擎
儘管各個平臺在底層(如線程)實現方面都各不相同,但MySQL基本上能保證在各個平臺上的物理結構的一致性。因此,用戶應該能很好的理解MySQL資料庫在所有這些平臺是如何運作的。
1.1 定義資料庫和實例
資料庫:物理操作系統文件或其他形式文件類型的集合。在MySQL資料庫中,資料庫文件可以是frm、myd、myi、ibd文件。NDB引擎,是存放於記憶體之中的文件,但定義不變。
實例:MySQL資料庫由後臺線程以及一個共用記憶體區組成。共用記憶體可以被運行的後臺線程所共用。在集群情況下,可能存在一個資料庫被多個數據實例使用的情況。
從概念上來講,資料庫是文件的集合,是按照某種數據模型組織起來並存放於二級存儲器中的數據集合。
資料庫實例是程式,是位於用戶與操作系統之間的一層數據管理軟體,用戶對資料庫數據的任何操作,包括資料庫定義、數據查詢、數據維護、資料庫運行控制等都是在資料庫實例下進行的,應用程式只有通過資料庫實例才能和資料庫打交道。
MySQL 是一個單進程多線程架構的資料庫。
MySQL 資料庫是按照 /etc/my.cnf -> /etc/myssql/my.cnf -> /usr/local/mysql/etc/my.cnf -> ~/.my.cnf 的順序讀取配置文件的。
如果幾個配置文件中有相同的參數,MySQL資料庫以最後讀取到的一個配置文件中的參數為準。
1.2 MySQL 體繫結構
由圖可知,MySQL由以下幾部分組成:
- 連接池組件
- 管理服務和工具組件
- SQL介面組件
- 查詢分析器組件
- 優化器組件
- 緩衝(Cache)組件
- 插件式存儲引擎
- 物理文件
MySQL區別於其他資料庫的最重要的一個特點就是插件式的表存儲引擎,註意,存儲引擎是基於表的。
1.3 MySQL存儲引擎
1.3.1 InnoDB 存儲引擎
其設計目標主要是面向線上事務處理(OLTP)的應用。其特點是支持事務、行鎖設計、支持外鍵、非鎖定讀(MVCC,即預設讀取操作不會產生鎖)。在MySQL5.5.8以後,InnoDB是預設的存儲引擎。
InnoDB通過使用多版本併發控制(MVCC)來獲得高併發,並實現了四種隔離級別,預設是 REPEATABLE級別
使用next-key locking 的策略來避免幻讀現象
提供了插入緩衝(insert buffer)、二次寫(double write)、自適應哈希索引(adaptive hash index)、預讀(read ahead)等高性能和高可用的功能
對錶中的數據採用聚集(clustered)方式,因此每張表都是按照主鍵的順序進行存放,如果沒有在表定義中指定主鍵,InnoDB存儲引擎將會為每一行生成一個6位元組的ROWID,並以此作為主鍵。
1.3.2 MyISAM存儲引擎
不支持事務、表鎖設計、支持全文索引,主要面向OLAP應用
MySQL 5.5.8 之前的預設存儲引擎
緩衝池只緩存索引文件,不緩存數據文件。數據文件由操作系統本身來完成
1.3.3 NDB 存儲引擎數據
省略
1.5 鏈接 MySQL
連接 MySQL操作是一個連接進程和MySQL資料庫實例進行通信。從程式設計的角度的來看,本質是進程通信。常見的進程通信方式有
管道、命名管道、命名字、TCP/IP套接字、UNIX域套接字。
1.5.1 TCP/IP 通信
這種方式在 TCP/IP 連接上建立一個基於網路的連接請求,一般情況下,客戶端在一臺伺服器,而MySQL實例(服務端)在另一臺伺服器,機器之間通過 TCP/IP 進行網路連接。
在通過TCP/IP 連接到MySQL 實例時,MySQL 資料庫會先檢查一張許可權視圖,用來判斷發起請求的客戶端是否允許連接到MySQL實例。
1.5.2 命名管道和共用記憶體
如果兩個需要進程通信的進程在同一個伺服器上,那麼可以使用命名管道。MySQL 4.1 之後,還提供了共用記憶體的連接方式。
1.5.3 UNIX 域套接字
在Linux 和 UNIX環境下,還可以使用UNIX 域套接字。UNIX 套接在不是一個協議,所以只能在 MySQL 客戶端和資料庫實例在同一臺伺服器上的情況下使用。
問題:當表的數據量大於1000萬時,MySQL性能會急劇下降嗎?
隨著行數的增加,性能會有所下降,但並不是線性下降,如果用戶選擇了正確的存儲引擎,正確的配置,再多的數據量MySQL也能承受。如官方手冊提及的,在InnoDB存儲超過1TB的數據,處理插入、更新的操作平均 800次/秒。