一、MySQL前世今生

作者: BruceLiu1 | 来源:发表于2017-07-24 09:07 被阅读342次
    图片来自网络

    文/Bruce.Liu1

    文章大纲

    1. MySQL简介
      1.1. MySQL之父
      1.2. MySQL历史
    2. MySQL现状及应用
      2.1. 全球数据库排行
      2.2. 全球最大网站Top20
      2.3. 国内MySQL行业应用
      2.4. top 3数据库对比
      2.5. 开源数据库对比
    3. MySQL主流分支
      3.1. MySQL
      3.2. Percona
      3.3. MariaDB
    4. MySQL体系结构简介
      4.1. MySQL逻辑概念
      4.2. MySQL存储结构
      4.3. 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

    扫描下方二维码关注本人微信号!欢迎大家交流学习!

    Bruce.Liu

    相关文章

      网友评论

      本文标题:一、MySQL前世今生

      本文链接:https://www.haomeiwen.com/subject/nrbthxtx.html