MySql體系結構和儲存引擎

readyao發表於2017-03-10

一、資料庫和資料庫例項

資料庫是檔案的集合,是依照某種資料模型組織起來並存放於二級儲存器中的資料集合;

資料庫例項是程式,是位於使用者與作業系統之間的一層資料庫管理軟體,使用者對資料庫資料的任何操作,包括資料庫定義、資料查詢、資料維護、資料庫執行控制等都是在資料庫例項下進行的,應用程式只有通過資料庫例項才能和資料庫打交道。

1、MySql被設計為一個單程式多執行緒的資料庫,MySql資料庫例項在系統上的表現就是一個程式。

root@TryHard:~# ps -ef | grep mysqld
mysql     1015     1  0  2016 ?        00:48:00 /usr/sbin/mysqld

可以看到MySql資料庫伺服器程式的程式號是1015。

2、啟動資料庫的時候,MySql會讀取配置檔案,它會根據配置檔案的引數來啟動資料庫。在MySql資料庫中,可以沒有配置檔案引數,在這種情況下,MySql會按照編譯時的預設引數設定啟動例項。

下面是檢視MySql資料庫例項啟動時,會在哪些位置查詢配置檔案,以及讀取配置檔案的順序。

root@TryHard:~# mysql --help

在上面命令的輸出中會有下面兩行輸出。

Default options are read from the following files in the given order:
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf 

可以看出MySql啟動時會讀取的配置檔案以及讀取配置檔案的順序。

3、配置檔案中有一個引數是datadir,該引數指定了資料庫在磁碟中將資料所儲存的目錄。

這裡寫圖片描述

二、MySql體系結構

下面是MySql的結構圖:
這裡寫圖片描述

從圖中可以看到MySql主要由以下幾部分組成:
1、連線池元件
2、管理服務和工具元件
3、SQL介面元件
4、查詢分析器元件
5、優化器元件
6、緩衝(Cache)元件
7、外掛式儲存引擎
8、物理檔案

MySql資料庫區別於其它資料庫的最重要的一個特點就是其外掛式的表儲存引擎。MySql外掛式的儲存引擎架構提供了一系列標準的管理和服務支援,這些標準與儲存引擎本身無關,可能是每個資料庫系統本身都必需的,如Sql分析器和優化器等。
儲存引擎是基於表的,而不是資料庫。

1、InnoDB儲存引擎
InnoDB儲存引擎支援事務,其設計目標主要面向線上事務處理(OLTP)的應用。其特點是行鎖設計、支援外來鍵,並支援類似於Oracle的非鎖定讀,即預設讀取操作不會產生鎖。5.5.8版本開始,InnoDB儲存引擎是預設的儲存引擎。

InnoDB儲存引擎將資料放在一個邏輯的表空間中,這個表空間就像黑盒子一樣由InnoDB儲存引擎自身進行管理。
從MySql4.1版本開始,它可以將每個InnoDB儲存引擎的表單獨存放在一個獨立的ibd檔案中。
InnoDB儲存引擎通過使用多版本併發控制來獲得高併發性,並且實現了SQL標準的4中隔離級別,預設是repeatable級別。
同時,InnoDB儲存引擎使用一種被稱為next-key locking的策略來避免幻讀現象的產生。
InnoDB儲存引擎還提供了插入緩衝、二次寫、自適應雜湊索引、預讀等高效能和高可用的功能。
對於表中資料的儲存,InnoDB儲存引擎採用了聚集的方式,因此每張表的儲存都是按照主鍵的順序程式存放。如果沒有顯式地在表定義時指定主鍵,InnoDB儲存引擎會為每一行生成一個6位元組的ROWID,並以此作為主鍵。

2、MyISAM儲存引擎
MyISAM儲存引擎不支援事務、表鎖設計,支援全文索引,主要面向一些OLAP資料庫應用。
MyISAM儲存引擎另一個與眾不同的地方是它的緩衝池只快取索引檔案,而不緩衝資料檔案。資料檔案的快取交給作業系統本身來完成。在5.1.23版本之後,64位的作業系統可以支援大於4GB的索引緩衝區。

MyISAM儲存引擎表由MYD和MYI組成,MYD用來存放資料檔案,MYI用來存放索引檔案。

3、NDB儲存引擎
NDB儲存引擎是一個叢集儲存引擎,NDB儲存引擎的特點是資料全部放在記憶體中,因此主鍵查詢的速度非常快。
NDB儲存引擎的連線操作(join)是在MySql資料庫層完成的,而不是在儲存引擎層完成的。這意味著,複雜的連線操作需要巨大的網路開銷,因此查詢速度很慢。

4、Memory儲存引擎
Memory儲存引擎將表中的資料存放在記憶體中,如果資料庫重啟或發生崩潰,表中的資料都將消失。它適合用於儲存臨時資料的臨時表,以及資料倉儲中的緯度表。
Memory儲存引擎預設使用雜湊索引,而不是B+樹索引。
雖然Memory儲存引擎速度快,但是它支援表鎖,併發效能較差,並且不支援TEXT和BLOB列型別。最重要的是,儲存變長欄位時是按照定常欄位的方式進行的,因此會浪費記憶體。

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

6、Federated儲存引擎
Federated儲存引擎並不存放資料,它只是指向一臺遠端MySql資料庫伺服器上的表。

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

8、其它儲存引擎
MySql還支援的儲存引擎包括Merge,CSV,Sphinx和Infobright。

三、MySql的問題

1、MySql資料庫支援全文索引嗎?
支援。MyISAM、InnoDB和Sphinx儲存引擎都支援全文索引。
2、當表的資料量大於1000萬時MySql的效能會急劇下降嗎?
不會。因為MySql是資料庫,不是檔案,隨著資料行數的增加,效能當然會有所下降,但是這些下降不是線性的。如果使用者選擇了正確的儲存引擎,以及正確的配置,再多的資料量MySql也能承受。

四、各儲存引擎之間的比較

這裡寫圖片描述

可以通過show engines語句檢視當前使用的MySql支援的儲存引擎,也可以通過查詢information_schema資料庫下的engines表。

這裡寫圖片描述

五、連線MySql

連線MySql資料庫的操作其實是一個連線程式和MySql資料庫例項進行通訊。
從程式設計的角度來說,本質上是程式通訊。程式通訊方式主要有:管道,命令管道,命名字,TCP/IP套接字,UNIX域套接字。

1、TCP/IP
TCP/IP套接字方式是MySql資料庫在任何平臺下都提供的連線方式,也是網路中使用的最多的一種方式。這種方式在TCP/IP連線上建立一個基於網路的連線請求,一般客戶端在一臺主機上,而MySql資料庫例項在另一臺主機上。

#mysql -h 192.168.0.1 -u xxx -p
Enter password:

在通過TCP/IP連線到MySql例項時,MySql資料庫會先檢查一張許可權檢視,用來判斷髮起請求的客戶端IP是否允許連線到MySql資料庫例項。
在資料庫mysql中的user表中記錄著這些使用者。

這裡寫圖片描述

2、命名管道和共享記憶體
如果兩個需要通訊的程式在同一臺主機上,那麼可以使用命名管道。
在MySql資料庫中需要在配置檔案中啟用–enable-named-pipe選項。
在4.1之後的版本中,還提供了共享記憶體的連線方式,這是通過在配置檔案中新增–shared-memory實現的。如果想使用共享記憶體的方式,在連線時,MySql客戶端還必須使用–protocol=memory選項。

3、UNIX域套接字
在Linux和Unix下,還可以使用UNIX域套接字。
UNIX域套接字其實不是網路協議,只有當客戶端和資料庫例項在同個主機上時,才可以使用。
使用者可以在配置檔案中指定套接字檔案的路徑,如–socket=/tmp/mysql.sock。
使用者可以通過下面的命令查詢UNIX域套接字檔案的位置:

mysql> show variables like 'socket';
+---------------+-----------------------------+
| Variable_name | Value                       |
+---------------+-----------------------------+
| socket        | /var/run/mysqld/mysqld.sock |
+---------------+-----------------------------+
1 row in set (0.00 sec)

然後可以通過下面的方式連線資料庫伺服器:

root@TryHard:~# mysql -u root -S /var/run/mysqld/mysqld.sock -p
Enter password: 

相關文章