MySQL 的前世今生

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 协议》,转载必须注明作者和本文链接
阿德
zhangdeTalk
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!