- MySQL數據庫管理與開發實踐教程 (清華電腦學堂)
- 程朝斌
- 4794字
- 2021-03-19 18:16:45
1.1 MySQL概述
MySQL是一個關系數據庫管理系統(Relational DataBase Management System,RDBMS)。它是一個程序,可以存儲大量的種類繁多的數據,并且提供服務以滿足任何組織的需要,包括零售商店、大型的商業和政府行業。與MySQL同屬于RDBMS的還有著名的Oracle、SQL Server和DB2。
下面從MySQL的歷史開始講解,逐步了解MySQL的方方面面。
1.1.1 MySQL發展歷史
MySQL的歷史最早可以追溯到1979年,當時有一個名叫Monty Widenius的程序員在名為TcX的小公司打工,并且使用BASIC設計了一個報表工具,使其可以在4MB主頻和16KB內存的計算上運行。沒過多久,Monty又將此工具用C語言進行了重寫并移植到了UNIX平臺。當時,這只是一個很底層的且僅面向報表的存儲引擎,名叫Unireg。
雖然TcX這個小公司資源有限,但Monty天賦極高,面對資源有限的不利條件,反而更能發揮他的潛能。Monty總是力圖寫出最高效的代碼,并因此養成了習慣。與Monty在一起的其他同事,很少有人能堅持把那些代碼持續寫到20年后,但他做到了。
1990年,TcX公司的客戶中開始有人要求為他的API提供SQL支持。當時有人提議直接使用商用數據庫,但是Monty覺得商用數據庫的速度難以令人滿意。于是,他直接借助于MySQL的代碼,將它集成到自己的存儲引擎中。令人失望的是,效果并不太令人滿意,于是,Monty雄心大起,決心自己重寫一個SQL支持。
1996年,MySQL 1.0版本發布,可以在小范圍內使用。到了1996年10月,MySQL 3.11.1版本發布,沒有2.x版本,最開始只提供了Solaris下的二進制版本。一個月后,Linux版本出現了。這時的MySQL還非常簡陋,除了在一個表上做一些INSERT、UPDATE、DELETE和SELECT操作外,沒有其他更多的功能。
緊接下來的兩年里,MySQL被依次移植到各個平臺。它在發布時采用的許可策略有些與眾不同:允許免費使用,但是不能將MySQL與自己的產品綁定在一起發布。如果想一起發布,就必須使用特殊許可,這就意味著用戶要花“銀子”。當然,商業支持也是需要花“銀子”的。其他方面用戶怎么用都可以,這種特殊許可為MySQL帶來了一些收入,從而為它的持續發展打下了良好的基礎。
MySQL關系型數據庫于1998年1月發行第一個版本。它使用系統核心的多線程機制提供完全的多線程運行模式,提供了面向C、C++、Eiffel、Java、Perl、PHP、Python以及Tcl等編程語言的編程接口(API)。支持多種字段類型,并提供了完整的操作符支持。
1999—2000年,MySQL AB公司在瑞典成立。Monty與Sleepycat合作開發出了Berkeley DB(簡稱為BDB)引擎,由于BDB支持事務處理,所以MySQL從此開始支持事務處理了。
2000年4月,MySQL對舊的存儲引擎ISAM進行了整理,將其命名為MyISAM。2001年,Heikki Tuuri向MySQL提出建議,希望能集成他的存儲引擎InnoDB,這個引擎同樣支持事務處理,還支持行級鎖。該引擎之后被證明是最為成功的MySQL事務存儲引擎。
2003年12月,MySQL 5.0版本發布,提供了視圖和存儲過程等功能。
2008年1月,MySQL AB公司被Sun公司以10億美金收購,MySQL數據庫進入Sun時代。在Sun時代,Sun公司對其進行了大量的推廣、優化和Bug修復等工作。
2008年11月,MySQL 5.1發布,它提供了分區、事件管理,以及基于行的復制和基于磁盤的NDB集群系統,同時修復了大量的Bug。
2009年4月,甲骨文以74億美元收購Sun公司,自此MySQL數據庫進入Oracle時代,而其第三方的存儲引擎InnoDB早在2005年就被甲骨文收購。
2010年12月,MySQL 5.5發布,其主要新特性包括半同步的復制及對SIGNAL/RESIGNAL的異常處理功能的支持,最重要的是InnoDB存儲引擎終于變為當前MySQL的默認存儲引擎。MySQL 5.5不是時隔兩年后的一次簡單的版本更新,而是加強了MySQL各個方面在企業級的特性。甲骨文公司同時也承諾MySQL 5.5和未來版本仍是采用GPL授權的開源產品。
2013年2月,甲骨文公司宣布MySQL 5.6正式版發布,首個正式版本號為5.6.10。2014年5月30日,發布了MySQL 5.6.19版本,這是目前最新的版本,本書介紹的MySQL數據庫就是使用5.6.19版本。
1.1.2 MySQL主要特性
下面羅列了MySQL數據庫的一些主要特性。
(1)內部構件和可移植性。
(2)使用C和C++編寫。
(3)用眾多不同的編譯器進行了測試。
(4)能夠工作在眾多不同的平臺上。
(5)使用GNU Automake、Autoconf和Libtool進行移植。
(6)提供了用于C、C++、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl的API。
(7)采用核心線程的完全多線程,如果有多個CPU,它能方便地使用這些CPU。
(8)提供了事務性和非事務性存儲引擎。
(9)使用了極快的“B樹”磁盤表(MyISAM)和索引壓縮。
(10)添加另一個存儲引擎相對簡單。如果打算為內部數據庫添加一個SQL接口,該特性十分有用。
(11)極快的基于線程的內存分配系統。
(12)通過使用優化的“單掃描多連接”,能實現極快的連接。
(13)存儲器中的哈希表用作臨時表。
(14)SQL函數是使用高度優化的類庫實現的,運行很快。通常,在完成查詢初始化后,不存在存儲器分配。
(15)服務器可作為單獨程序運行在客戶/服務器聯網環境下。它也可作為庫提供,可嵌入(鏈接)到獨立的應用程序中。這類應用程序可單獨使用,也能在網絡環境下使用。
(16)眾多列類型:帶符號/無符號整數,1、2、3、4、8字節長,FLOAT,DOUBLE,CHAR,VARCHAR,TEXT,BLOB,DATE,TIME,DATETIME,TIMESTAMP,YEAR,SET,ENUM,以及OpenGIS空間類型。
(17)在SELECT查詢的WHERE子句中,提供完整的操作符和函數支持。例如:
mysql> SELECT CONCAT(first_name, ' ', last_name) -> FROM citizen -> WHERE income/dependents > 10000 AND age > 30;
(18)對SQL GROUP BY和ORDER BY子句的全面支持。支持聚合函數COUNT(),COUNT(),AVG(),STD(),SUM(),MAX()和MIN()等。
(19)支持LEFT OUTER JOIN和RIGHT OUTER JOIN,采用標準的SQL和ODBC語法。
(20)MySQL的SHOW命令可用于檢索關于數據庫、數據庫引擎、表和索引的信息。EXPLAIN命令可用于確定優化器處理查詢的方式。
(21)函數名與表名或列名不沖突。例如,ABS是有效的列名。唯一的限制在于,調用函數時,函數名和隨后的符號“(”之間不得有空格。
(22)十分靈活和安全的權限和密碼系統,允許基于主機的驗證。連接到服務器時,所有的密碼傳輸均采用加密形式,從而保證了密碼安全。
(23)處理大型數據庫:有用戶使用MySQL服務器包含5千萬條記錄的數據庫,有些用戶將MySQL用于包含60000個表和約50億行的數據庫。
(24)每個表可支持高達64條索引(在MySQL 4.1.2之前為32條)。每條索引可由1~16個列或列元素組成。最大索引寬度為1000字節(在MySQL 4.1.2之前為500)。索引可使用具備CHAR、VARCHAR、BLOB或TEXT列類型的列前綴。
(25)在任何平臺上,客戶端可使用TCP/IP協議連接到MySQL服務器。在Windows系統的NT系列中(NT、2000、XP或2003),客戶端可使用命名管道進行連接。在UNIX系統中,客戶端可使用UNIX域套接字文件建立連接。
(26)對數種不同字符集的全面支持,包括latin1 (cp1252)、german、big5、ujis等。例如,在表名和列名中允許使用斯堪的納維亞字符‘?’、‘?’和‘?’。從MySQL 4.1開始,提供了Unicode支持。
(27)所有數據均以所選的字符集保存。正常字符串列的比較不區分大小寫。
(28)MySQL服務器提供了對SQL語句的內部支持,可用于檢查、優化和修復表。通過mysqlcheck客戶端,可在命令行上使用這類語句。MySQL還包括myisamchk,這是一種很快的命令行實用工具,可用于在MyISAM表上執行這類操作。
(29)對于所有MySQL程序,均能通過“--help”或“-?”選項調用,以獲取聯機幫助信息。
1.1.3 MySQL適用場景
目前,MySQL的使用用戶已經達千萬級別了,其中不乏企業級用戶??梢哉f是目前最為流行的開源數據庫管理系統軟件了。任何產品都不可能是萬能的,也不可能適用于所有的應用場景。下面列舉了MySQL最常用到的4種場景。
1.Web網站系統
Web站點是MySQL最大的客戶群,也是MySQL發展史上最為重要的支撐力量。MySQL之所以能成為Web站點開發者們最青睞的數據庫管理系統,是因為MySQL數據庫的安裝和配置都非常簡單,使用過程中的維護也不像很多大型商業數據庫管理系統那么復雜,而且性能出色。還有一個非常重要的原因就是MySQL是開放源代碼的,完全可以免費使用。
2.日志記錄系統
MySQL數據庫的插入和查詢性能都非常高效,如果設計得較好,在使用MyISAM存儲引擎的時候,兩者可以做到互不鎖定,達到很高的并發性能。所以,對需要大量的插入和查詢日志記錄的系統來說,MySQL是非常不錯的選擇。比如處理用戶的登錄日志、操作日志等,都是非常適合的應用場景。
3.數據倉庫系統
隨著現在數據倉庫數據量的飛速增長,需要的存儲空間越來越大。數據量的不斷增長,使數據的統計分析變得越來越低效,也越來越困難。怎么辦?這里有幾個主要的解決思路,一個是采用昂貴的高性能主機以提高計算性能,用高端存儲設備提高I/O性能,效果理想,但是成本非常高;第二個就是通過將數據復制到多臺使用大容量硬盤的廉價服務器上,以提高整體計算性能和I/O能力,效果尚可,存儲空間有一定限制,成本低廉;第三是通過將數據水平拆分,使用多臺廉價的服務器和本地磁盤來存放數據,每臺機器上面都只有所有數據的一部分,解決了數據量的問題,所有服務器一起并行計算,也解決了計算能力問題,通過中間代理程序調配各臺機器的運算任務,既可以解決計算性能問題又可以解決I/O性能問題,成本也很低廉。
在上面的三個方案中,第二和第三個的實現MySQL都有較大的優勢。通過MySQL的簡單復制功能,可以很好地將數據從一臺主機復制到另外一臺,不僅在局域網內可以復制,在廣域網同樣可以。當然,很多人可能會說,其他的數據庫同樣也可以做到,不是只有MySQL有這樣的功能。確實,很多數據庫同樣能做到,但是MySQL是免費的,其他數據庫大多都是按照主機數量或者CPU數量來收費,當我們使用大量的服務器的時候,授權費用相當驚人。第一個方案,基本上所有數據庫系統都能夠實現,但是其高昂的成本并不是每一個公司都能夠承擔的。
4.嵌入式系統
嵌入式環境對軟件系統最大的限制是硬件資源非常有限,在嵌入式環境下運行的軟件系統,必須是輕量級低消耗的軟件。MySQL在資源使用方面的伸縮性非常大,可以在資源非常充裕的環境下運行,也可以在資源非常少的環境下正常運行。它對于嵌入式環境來說,是一種非常合適的數據庫系統,而且MySQL有專門針對于嵌入式環境的版本。
1.1.4 MySQL分支版本
在MySQL的發展中最初由MySQL AB公司開發,之后被Sun公司收購,再被Oracle公司收購。另外,由于MySQL開源代碼的原因,市場上出現了很多MySQL的分支版本,本節將介紹其中最有代表性的三個,分別是Percona Server、MariaDB和Drizzle。
1.Percona Server
Percona Server是一個與MySQL向后兼容的替代品,它盡可能不改變SQL語法、客戶/服務器協議和硬盤上的文件格式。任何運行在MySQL上的數據庫都可以運行在Percona Server上而不需要修改。切換到Percona Server的方法也很簡單,只需關閉MySQL和啟動Percona Server即可,而不需要導出和重新導入數據,反之切換回去也不麻煩。
Percona Server只對標準MySQL中需要并且可以產生顯著好處的地方做了改進,并且努力與原版保持盡可能的相同。
Percona Server包括Percona XtraDB存儲引擎,即改進版本的InnoDB。這同樣是一個向后兼容的替代品。例如,如果要創建一個使用InnoDB存儲引擎的表,Percona Server能自動識別并用XtraDB替代之。
Percona Server的一些改進已經包括在最新的MySQL版本中,許多其他改進也只是稍做修改而重新實現。因此,Percona Server也被稱為MySQL新特性的“搶鮮”版本。
2.MariaDB
在Sun收購MySQL之后,MySQL的創建者之一Monty離開Sun公司,隨后成立Monty公司創建了MariaDB。MariaDB的目標是社區開發,Bug修改和許多的新特性(特別是與社區開發的特性相集成)。
與Percona Server相比,MariaDB包括更多對服務器的擴展。例如,有許多是對查詢優化和復制的改變。它使用Aria存儲引擎取代了MyISAM來存儲內部臨時表。同時也包括很多社區的引擎,如SphinxSE和PBXT。
MariaDB是原版MySQL的超集,因此已有的系統不需要修改就可以運行,就像Percona Server一樣。然而,MariaDB更適用一些特定的場景,例如復雜的子查詢或多表關聯。
3.Drizzle
Drizzle是真正的MySQL分支,而非只是一個變種或者增強版本。它并不與MySQL兼容,盡管區分上還并不是太大。在許多場合并不能簡單地將MySQL替換為Drizzle,因為后者對SQL語法的修改太大了。
Drizzle創建于2008年,致力于更好地服務MySQL用戶。其創建目標是更好地滿足網頁應用的核心功能。與MySQL相比,它更加簡單,選擇更少。例如,只能使用utf8作為字符集,并且只有一個類型的BLOB,主要針對64位硬件編譯,且支持IPv6網絡等。
Drizzle數據庫服務器的一個關鍵目標是消除MySQL上的異常和遺留的行為。例如,聲明了NOT NULL列但發現數據庫列中存儲了NULL。MySQL上一些不明顯或者復雜的特性被刪除,例如觸發器和查詢緩存等。
在代碼層,Drizzle構建于一個精簡內核和插件的微核心架構之上。服務器的核心比起MySQL已經精簡許多。幾乎任何東西都是以插件形式使用。Drizzle使用了諸如Boost的標準開源庫,并遵從代碼、架構和API方面的標準。
目前,Drizzle雖然已經在某些產品環境下部署但還沒有廣泛應用。Drizzle項目的理念是拋棄向后兼容的束縛,而這意味著相對于遷移一個已有的應用而言,它更適合新的應用開發。
- Git Version Control Cookbook
- 微服務設計原理與架構
- 數據結構(Java語言描述)
- Internet of Things with the Arduino Yún
- Troubleshooting PostgreSQL
- Visual C#通用范例開發金典
- 高效使用Greenplum:入門、進階與數據中臺
- Java語言程序設計實用教程(第2版)
- JBoss AS 7 Development
- Socket.IO Cookbook
- 微信公眾平臺開發最佳實踐
- Game Development Patterns and Best Practices
- JavaScript編程精解(原書第3版)
- Appcelerator Titanium Smartphone App Development Cookbook
- Image Processing with ImageJ(Second Edition)