MySql體系結構和存儲引擎

一、數據庫和數據庫實例

數據庫是文件的集合,是依照某種數據模型組織起來並存放於二級存儲器中的數據集合;

數據庫實例是程序,是位於用戶與操作系統之間的一層數據庫管理軟件,用戶對數據庫數據的任何操作,包括數據庫定義、數據查詢、數據維護、數據庫運行控制等都是在數據庫實例下進行的,應用程序只有通過數據庫實例才能和數據庫打交道。

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: 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章