1.MySQL簡介
1.1.MySQL之父
關於MariaDB、MySQL、MaxDB名字的由來,這裡有個不得不說的小插曲。Monty有一個女兒,名叫My,因此他將自己開發的資料庫命名為MySQL。Monty還有一個兒子,名為Max,因此在2003年,SAP公司與MySQL公司建立合作伙伴關係後,Monty又將與SAP合作開發的資料庫命名為MaxDB。而現在的MariaDB中的Maria是Monty小孫女的名字。
圖片來自網路
Michael “Monty” Widenius, 1962年3月3日出生於芬蘭赫爾辛基。
開源 MySQL資料庫的創始成員、MySQL AB公司的技術長、MySQL資料庫第一行程式碼的作者、MySQL資料庫命名人、MariaDB創始人兼技術長;獨自完成撰寫MySQL資料庫伺服器端95%的程式碼。
1.2.MySQL歷史
MySQL的海豚標誌的名字叫“sakila”,它是由MySQL AB的創始人從使用者在“海豚命名”的競賽中建議的大量的名字表中選出的。獲勝的名字是由來自非洲史瓦濟蘭的開源軟體開發者Ambrose Twebaze提供。根據Ambrose所說,Sakila來自一種叫SiSwati的史瓦濟蘭方言,也是在Ambrose的家鄉烏干達附近的坦尚尼亞的Arusha的一個小鎮的名字
MySQL的歷史可以追溯到1979年。當時Allan Larsson和Michael Widenius(Monty)開了一家自己的諮詢公司,取名TcX,名字的由來已無從考證。有道是”前世盡付真情,今生亦現福緣積厚”。那年一個夜黑風高的晚上,Michael基於BASIC語言寫出了他的第一款資料庫報表工具UNIREG。
有當年的天氣記錄為證,Michael寫完該工具時極光異常明亮,炫彩無比。大凡重大事情的發生,後來的著述人都會記錄有一些類似的怪現象。比如颳風、下雨、冒仙氣什麼的,還有天上星星異常閃爍等等,反正就是說明這種事情很不簡單。
最初的UNIREG是執行在瑞典人制造的ABC800計算機上的。ABC800的記憶體只有32KB,CPU是頻率只有4MHz的Z80。在1983年Monty遇到了David Axmark,兩人相見恨晚,開始合作運營TcX,Monty負責技術,David搞管理。後來TcX將UNIREG移植到其他更加強大的硬體平臺,主要是Sun的平臺。
圖片來自網路
一次Monty接到了一個專案,需要為當時的UNIREG提供更加通用的SQL介面,Monty找到了David Hughes –mSQL的發明人,商討合作事宜。然而,經過一番測試後,他們發現mSQL的速度並不盡如人意,無法滿足客戶的需求。
遇到這種問題,程式設計師出身的Monty無法委曲求全,毅然採取了革命性的態度–重新設計整個系統。1995年5月23日,MySQL的第一個內部版本發行了,並在第二年對外公佈了MySQL官方正式發行版(3.11.1)。有趣的是,第一個MySQL正式版恰巧只能執行在Sun Solaris上,彷彿昭示了它日後被Sun收購的命運。
在接下來的兩年中,MySQL被移植到不同的平臺,同時加入了不少新的特性。到1998時,MySQL能夠執行在10多種作業系統之上,其中包括應用非常廣泛的 FreeBSD、Linux、Windows 95和Windows NT等。很快MySQL 3.22也釋出了,但它仍然存在很多問題–如不支援事務操作、子查詢、外來鍵、儲存過程和檢視等功能。正因為這些缺陷,當時許多Oracle和SQL Server的使用者對MySQL根本不屑一顧。
大概在1999的冬天,下了很大一場雪。然後獨立的商業公司MySQL AB就在瑞典的中部城市Uppsala成立了。並於同年釋出了包含事務型儲存引擎BDB的MySQL 3.23。在整合BDB儲存引擎的過程中,MySQL開發團隊得到了很好的鍛鍊,為後來能將InnoDB整合以及開發開放外掛式的儲存引擎架構打下了堅實的基礎。
MySQL從誕生之初就提供了雙重的授權標準:個人使用是免費的,如果用於商業網站搭建或者Windows平臺下就必須購買商業許可證。在2000年的時候MySQL做了一個重大的決定,改換成了GPL許可模式,也就是說商業使用者也無需再購買許可證,但必須把他們的原始碼公開。雖然MySQL AB因此在收入上遭受了巨大的打擊,損失了將近80%的收入,但他們依然堅持了GPL許可模式。
與此同時,芬蘭公司Heikki開始接觸MySQL AB,討論將Heikki的儲存引擎InnoDB整合到MySQL資料庫中的可行性。雙方的合作非常順利,並於2001年推出MySQL 4.0 Alpha版本。經過兩年的公開測試和應用,到了2003年,包含InnoDB的MySQL已經變得非常穩定了。隨即在同一年,MySQL推出4.1版,第一次使得MySQL支援子查詢,支援Unicode和預編譯SQL等功能。
MySQL 4.1還在Alpha版時,公司已決定並行開發5.0版。因為他們打算加快MySQL的開發速度以適應日益苛刻的市場需求。這個新版本是有史以來MySQL最大的變化,新增了儲存過程、服務端遊標、觸發器、查詢優化以及分散式事務等在大家看來一個”正常資料庫管理系統”應當擁有的一整套功能。
2008年2月,當時的業界開源老大Sun Microsystems動用10億美元收購了MySQL,造就了開源軟體的收購最高價。這次交易給開源交易設立了一個新的基準。在此之前的交易金額(JBoss、Zimbra、XenSource、Gluecode)從沒接近過10億美元,全部加起來才差不多與Sun Microsystems購買MySQL的花費持平。MySQL被收購之後,MySQL圖示停止使用,取而代之的是Sun/MySQL圖示。
MySQL和Sun合併之後,推出了MySQL 5.1GA版和MySQL 5.4 Beta版。5.4的推出照搬了4.1和5.0當時的開發模式,讓5.4和6.0並行處於Beta開發階段。
螳螂捕蟬,黃雀在後。2009年,資料庫老大Oracle大筆一揮,開出74億美元的支票,將Sun Microsystems和MySQL通盤收於旗下。
這裡附帶說明一下Drizzle,它是Sun/MySQL的Brian在2008年提出的一個計劃。目標是將開發一個更小、更輕、更快的資料庫,用作雲端計算(Cloud Computing)和Web應用的基礎架構。
標誌性事件
- 1999年,MySQL AB在瑞典正式宣佈成立。
- 2000年,ISAM華麗轉身MyISAM儲存引擎。同年MySQL開放了自己的原始碼,並且基於GPL許可協議。同年9月innoDB推出。
- 2003年,MySQL4.0釋出,正式整合innodb
- 2005年,MySQL 5.0釋出。同年Oracle把InnoDB引擎的開發公司innobase收購完成。MySQL明確地表現出邁向高效能資料庫的發展步伐。
- 2006年,sun公司收購了MySQL公司,出價10億美元。
- 2009年,Oracle公司收購sun,將MySQL納入囊中。
- 2010年,MySQL 5.5正式版釋出,Oracle完成了大量改進,並將innodb改成預設引擎。
- 2013年,MySQL 5.6 GA版本釋出。
- 近期 - MySQL 5.7 GA版本橫空出世,其效能、新特性、效能分析帶來了質的改變。
2.MySQL現狀及應用
2.1.全球資料庫排行
DB-Engines通過以下6個方面的統計資料來綜合評估各個資料庫產品得分並給出綜合排名(https://db-engines.com/en/ranking):
- 資料庫相關網站數量(當前通過google、bing、yandex搜尋引擎統計)
- 公眾關注度(通過Google trends計算)
- 技術討論活躍度(通過Stack Overflow,DBA Stack Exchange問答及使用者統計)
- 招聘職位(通過Indeed、Simply Hired統計)
- 專業檔案(通過LinkedIn、Upwork統計)
- 社交網路資訊(通過Twitter統計)
圖片來自網路
圖片來自網路
2.2.全球最大網站Top20
圖片來自網路
- Facebook.com
- Google.com
- YouTube.com
- Yahoo.com
- WIKipedia.org - 維基百科
- Live.com – 微軟新的電子郵件服務
- qq.com – 騰訊
- Microsoft.com – 微軟產品/更新/下載
- Baidu.com – 百度
- Msn.com – 微軟自有網際網路資訊
- Blogger.com – 部落格平臺
- ASK.com - 搜尋引擎
- Taobao.com 淘寶
- Twiter.com – 實時通訊平臺
- Bing.com – 必應
- Sohu.com – 搜狐
- Apple.com – 蘋果
- WrodPress.com – 成行經歷
- Sina.com – 新浪
- Amazon.com-亞馬遜
2.3.國內MySQL行業應用
圖片來自原創
2.4.top 3資料庫對比
圖片來自原創
MySQL
開源軟體
適用於OLTP場景
伺服器數量大
主要應用於網際網路行業Oracle
商業資料庫
適用於OLTP/OLAP場景
基於IOE架構模式
傳統行業的霸主SQL Server
商業資料庫
適用於OLTP/OLAP場景
只能執行在Windows環境下
國外SQL Server應用場景
2.5.開源資料庫對比
去IOE的時代,就曾經聽說過,開源資料庫PG能夠相容95%的ORACLE程式碼。這麼多年過去了。
雖然各種號稱PG資料庫各方面都很強。但從實際的全球最大網站TOP20來看主力依舊是MySQL。
圖片來自原創
3.MySQL主流分支
儘管MySQL是最受歡迎的程式之一,但是許多開發人員認為有必要將其拆分成其他專案,並且每個分支專案都有自己的專長。該需求以及Oracle對核心產品增長緩慢的擔憂,導致出現了許多開發人員感興趣的子專案和分支。本文將討論受人們關注的三個流行MySQL分支:Drizzle、MariaDB和Percona Server(包括XtraDB引擎)
3.1.MySQL
官方MySQL,前身MySQL AB / SUM/最後被Oracle公司收入麾下。
3.2.Percona
Percona Server就是這樣一款產品,由領先的MySQL諮詢公司Percona釋出。Percona Server是一款獨立的資料庫產品,為使用者提供了換出其MySQL安裝並換入Percona Server產品的能力。通過這樣做,就可以利用XtraDB儲存引擎。Percona Server聲稱可以完全與MySQL相容,因此從理論上講,您無需更改軟體中的任何程式碼。這確實是一個很大的優勢,適合在您尋找快速效能改進時控制質量。因此,採用Percona Server的一個很好的理由是,利用XtraDB引擎來儘可能地減少程式碼更改。
此外,他們是XtraDB儲存引擎的原作者。Percona將此程式碼用作開原始碼,因此您可以在其他產品中找到它,但引擎的最初建立者與編寫此產品的是同一個人,所以您可以隨心所欲地使用此資訊。
Percona團隊的最終宣告是“Percona Server是由Oracle釋出的最接近官方MySQL Enterprise發行版的版本”,因此與其他更改了大量基本核心MySQL程式碼的分支有所區別。Percona Server的一個缺點是他們自己管理程式碼,不接受外部開發人員的貢獻,以這種方式確保他們對產品中所包含功能的控制。
下面是Percona Server的宣告,該宣告來自它們自己的網站:
- 可擴充套件性:處理更多事務;在強大的伺服器上進行擴充套件
- 效能:使用了XtraDB的Percona Server速度非常快
- 可靠性:避免損壞,提供崩潰安全(crash-safe)複製
- 管理:線上備份,線上表格匯入/匯出
- 診斷:高階分析和檢測
- 靈活性:可變的頁面大小,改進的緩衝池管理
3.3.MariaDB
MySQL之父Widenius先生離開了Sun之後,覺得依靠Sun/Oracle來發 展MySQL,實在很不靠譜,於是決定另開分支,這個分支的名字叫做 MariaDB;
在賣出MySQL之後Widenius發現兩個主要問題:
- MySQL核心開發團隊是封閉的,完全沒有Oracle之外的成員參加。很多高手即使 有心做貢獻,也沒辦法做到
- MySQL新版本的釋出速度,在Oracle收購Sun之後大為減緩。Widenius用資料比 較了收購之前和之後新版本的釋出速度。有很多bugfix和新的feature,都沒有及 時加入到釋出版本之中
目標是提供一個由社群開發的、穩定的、總是免費的MySQL分支,在用 戶級別上相容主流版本。我們為自己的版本和上游、社群版的互操作性 提高而努力;Monty Program公司承諾MariaDB將會一直保持獨立和開源。值得一提的是,Fedora 及OpenSUSE Linux更宣佈將在MariaDB推出下 一個版本後拋棄MySQL使用MariaDB。
MariaDB提供了MySQL提供的標準儲存引擎,即MyISAM和InnoDB。因此,實際上,可以將它視為MySQL的擴充套件集,它不僅提供MySQL提供的所有功能,還提供其他功能。MariaDB還聲稱自己是MySQL的替代,因此從MySQL切換到MariaDB時,無需更改任何基本程式碼即可安裝它。
最後可能也是最重要的一點是,MariaDB的主要建立者是Monty Widenius,也是MySQL的初始建立者。Monty成立了一家名為Monty Program的公司來管理MariaDB的開發,這家公司僱傭開發人員來編寫和改進MariaDB產品。這既是一件好事,也是一件壞事:有利的一面在於他們是Maria功能和bug修復的佼佼者,但公司不是以贏利為目的,而是由產品驅動的,這可能會帶來問題,因為沒有贏利的公司不一定能長久維持下去。
4.MySQL體系結構簡介
4.1.MySQL邏輯概念
圖片來自網路
連線層
通訊協議的處理、執行緒處理、網路許可權、賬號認證等處理層
許可權處理、結果快取(Query cache)、查詢解析、優化器、查詢執行、返回等儲存層
用於持久化處理層的資料,innodb、MyISAM、Memory、Heap
4.2.MySQL儲存結構
例項
由資料庫後臺程式/執行緒以及一個共享區域組成(程式的概念),資料庫例項是用來運算元據庫檔案的資料庫
資料庫(資料庫檔案)是一個或者一組二進位制檔案,通常來說存在與檔案系統之上單程式多執行緒結構
不會影響MySQL的效能,看程式如何寫。(多程式程式,程式間通訊開銷大於多執行緒)儲存引擎的概念
可以理解成檔案系統,例如FAT32, NTFS, EXT4。 一個表是一個分割槽,引擎就是分割槽的檔案系統
儲存引擎的物件就是表邏輯儲存結構
instance
database
schema
tablespace
table
4.3.MySQL檔案結構
圖片來自原創
MySQL配置檔案
my.cnf表結構的組成
表結構定義檔案:frm
innodb資料檔案:ibd
MyISAM資料檔案:myi
共享表空間檔案:ibdata*error log(錯誤日誌)
error_logbinary log(二進位制日誌)
記錄資料庫寫入操作的日誌,可以用於備份恢復後者是master/slave 的複製
log_bin
log_bin_index
log_bin_basenameslow query log(慢日誌)
將執行超過某一個時間戳的閾值的SQL語句記錄到檔案
slow_query_log
slow_launch_time
slow_query_log_filegeneral log(常規日誌也叫全量日誌)
開啟後將記錄所有連結到MySQL任何的操作
general_log
general_log_filerelay-log(中繼日誌)
io_thread 從master讀到的日誌寫到中繼日誌中,供sql_thread執行完,已完成複製成功
relay_log=relay-bininnodb redo log
5.6之前redo log 個數總大小不能超過4G
5.6.之前redo log的大小不能更改,變更後資料器啟動失敗
innodb_log_group_home_dir=/data01/mysql/mysql3306/logs
innodb_log_file_size=200M
innodb_log_files_in_group=3
轉載文章
原作者:BruceLiu1
文章連結:https://www.jianshu.com/p/9bb6e5690521
本作品採用《CC 協議》,轉載必須註明作者和本文連結