1. 程式人生 > >《MySQL技術內幕InnoDB存儲引擎》讀書筆記 第一章

《MySQL技術內幕InnoDB存儲引擎》讀書筆記 第一章

內存 ndb存儲 mvcc select mysql5.0 事務 myisam 包括 插入

Mysql體系結構和存儲引擎

1.1 定義數據庫和實例

  數據庫:物理操作系統文件或其他形式文件類型的集合。 數據庫文件可以使frm,MYD,MYI,ibd結尾的文件。

  實例:MySQL數據庫由後臺線程以及一個共享內存區組成。 數據庫實例才是真正用於操作數據庫文件的。

  實例與數據庫的關系通常是一一對應的,在集群情況下可能存在一個數據庫被多個數據實例使用的情況。

  MySQL被設計為一個單進程多線程架構的數據庫,這點與SQL Server比較類似,但與Oracle多進程的架構有所不同(Oracle的Windows版本也是單進程多線程的架構的)

  MySQL數據庫實例在系統上的表現就是一個進程。

  Oracle 中如果沒有參數文件,在啟動實例時會提示找不到該參數文件,數據庫啟動失敗。而在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。

  配置文件中有一個參數datadir,該參數指定了數據庫所在的路徑。在Linux操作系統下默認datadir為/usr/local/mysql/data

  可以用命令查看 mysql > SHOW VARIABLES LIKE ‘datadir’\G;

  

1.2 MySQL體系結構

  從概念上來說,數據庫是文件的集合,是依照某種數據模型組織起來並存放於二級存儲器中的數據集合;數據庫實例時是程序,是位於用戶與操作系統之間的一層數據管理軟件,用戶對數據庫數據的任何操作,包括數據庫定義、數據查詢、數據維護、數據庫運行控制等都是在數據庫實例下進行的,應用程序只有通過數據庫實例才能和數據庫打交道。

  MySQL由以下幾部分組成:

  連接池組件、管理服務和工具組件、SQL接口組件、查詢分析器組件、優化器組件、緩沖組件、插件式存儲引擎、物理文件。

  需要特別註意的是,存儲引擎是基於表的,而不是數據庫。

1.3 MySQL存儲引擎

  1.3.1 InnoDB存儲引擎

    InnoDB存儲引擎支持事物,面向在線是事物處理(OLTP)的應用。其特點是行鎖設計、支持外鍵,並支持類似於Oracle的非鎖定讀,即默認讀取操作不會產生鎖。

    從MySQL4.1(包括4.1)版本開始,InnoDB存儲引擎的表單獨存放到一個獨立的ibd文件中。此外,InnoDB存儲引擎支持用裸設備用來建立其表空間。

    如果沒有顯示地定義時指定主鍵,InnoDB存儲引擎會為每一行生成一個6字節的ROWID,並以此作為主鍵。

   1.3.2 MyISAM存儲引擎

    MyISAM存儲引擎不支持事務、表鎖設計,支持全文檢索,主要面向一些OLAP數據庫應用。在MySQL5.5.8版本之前MyISAM存儲引擎是默認的存儲引擎(除Windows版本外)。 MyISAM存儲引擎的緩沖池只緩存索引文件,而不緩沖數據文件。

    MyISAM存儲引擎表由MYD和MYI組成,MYD用來存放數據文件,MYI用來存放索引文件。 使用myisampack工具壓縮後的表是只讀的。

    在MySQL5.0版本之前,MyISAM默認支持的表大小為4GB, 5.0之後默認支持256TB的單表數據。

  1.3.3 NDB存儲引擎

    NDB存儲引擎是一個集群存儲引擎 更高的可用性 數據全部放在內存中(5.1版本後 可以將非索引數據放在磁盤上) 是高可用、高性能的集群系統。

    NDB存儲引擎的連接操作是在MySQL數據庫層完成的,而不是在存儲引擎層完成的。這意味著,復雜的連接操作需要巨大的網絡開銷,因此查詢速度很慢。如果解決了這個問題,NDB存儲引擎的市場應該非常巨大。

  1.3.4 Memory 存儲引擎

    Memory 存儲引擎(之前稱為HEAP存儲引擎)將表中的數據存放在內存中,如果數據重啟或發生崩潰,表中的數據都將消失。

    不支持TEXT和BLOB列類型。

  1.3.5 Archive 存儲引擎

    Archive存儲引擎只支持INSERT和SELECT操作,從MySQL5.1開始支持索引。

    Archive存儲引擎非常適合存儲歸檔數據,如日誌信息。Archive存儲引擎使用行鎖來實現高並發的插入操作,但其本身並不是事物安全的存儲引擎,其設計目標主要是提供高速的插入和壓縮功能。

  1.3.6 Federated存儲引擎

    Federated存儲引擎表並不存放數據,它只是指向一臺遠程數據庫服務器上的表。

  1.3.7 Maria存儲引擎

    可以看做是MyISAM的後續版本。Maria存儲引擎的特點是:支持緩存數據和索引文件,應用了行鎖設計,提供了MVCC功能,支持事物和非事務安全的選項,以及更好的BLOB字符類型的處理性能。

  mysql > SHOW ENGINES\G; //查看支持的存儲引擎

  1.5 連接MySQL

  連接MySQL操作是一個連接進程和MySQL數據庫實例進行通信。 進程通信的方式有管道、命名管道、命名字、TCP/IP套接字、UNIX域套接字。

  TCP/IP是基於網絡的,而套接字一般用於同一臺服務器。

  例:

    TCP/IP : C:\ > mysql -h 192.168.0.101 -u david -p

    UNIX域套接字: mysql -udavid -S /tmp/mysql.sock

1.6 小結

  數據庫和實例定義

  體系結構 進一步突出 實例和數據庫

  MySQL插件式存儲引擎

  MySQL存儲引擎無優劣差異只有適合不適合。

  

《MySQL技術內幕InnoDB存儲引擎》讀書筆記 第一章