文/Bruce.Liu1
文章大纲
- MySQL简介
1.1. MySQL之父
1.2. MySQL历史- MySQL现状及应用
2.1. 全球数据库排行
2.2. 全球最大网站Top20
2.3. 国内MySQL行业应用
2.4. top 3数据库对比
2.5. 开源数据库对比- MySQL主流分支
3.1. MySQL
3.2. Percona
3.3. MariaDB- 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):
- 数据库相关网站数量(当前通过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_file
relay-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
扫描下方二维码关注本人微信号!欢迎大家交流学习!