MySQL 的前世今生

zhangdeTalk發表於2020-02-13

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):

  1. 資料庫相關網站數量(當前通過google、bing、yandex搜尋引擎統計)
  2. 公眾關注度(通過Google trends計算)
  3. 技術討論活躍度(通過Stack Overflow,DBA Stack Exchange問答及使用者統計)
  4. 招聘職位(通過Indeed、Simply Hired統計)
  5. 專業檔案(通過LinkedIn、Upwork統計)
  6. 社交網路資訊(通過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_log

  • binary log(二進位制日誌)
    記錄資料庫寫入操作的日誌,可以用於備份恢復後者是master/slave 的複製
    log_bin
    log_bin_index
    log_bin_basename

  • slow query log(慢日誌)
    將執行超過某一個時間戳的閾值的SQL語句記錄到檔案
    slow_query_log
    slow_launch_time
    slow_query_log_file

  • general log(常規日誌也叫全量日誌)
    開啟後將記錄所有連結到MySQL任何的操作
    general_log
    general_log_file

  • relay-log(中繼日誌)
    io_thread 從master讀到的日誌寫到中繼日誌中,供sql_thread執行完,已完成複製成功
    relay_log=relay-bin

  • innodb 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 協議》,轉載必須註明作者和本文連結

阿德

相關文章