- mysql发展历史
- Mysql社区版和企业版的区别
- Mysql分支版本的发展
- Mysql
- MariaDB
- Percona Server
- Mysql 基础架构
- 术语介绍
- 架构图
MySQL(发音为"my ess cue el")是一种开放源代码的关系型数据库管理系统,因为是开放源代码的,在下载后可以根据自己的需要进行修改。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
MySQL的海豚标志的名字叫“sakila”,它是由MySQL AB的创始人从用户在“海豚命名”的竞赛中建议的大量的名字表中选出的。获胜的名字是由来自非洲斯威士兰的开源软件开发者Ambrose Twebaze提供。根据Ambrose所说,Sakila来自一种叫SiSwati的斯威士兰方言,女性化名称Sakila源自SiSwati。Sakila也是坦桑尼亚、Arusha地区的一个镇的镇名,靠近Ambrose的母国乌干达。 MySQL名称的起源不明。一直以来,我们的基本目录以及大量库和工具均采用了前缀“my”。不过,共同创办人Monty Widenius的女儿名字也叫“My”。时至今日,MySQL名称的起源仍是一个迷,即使对我们也一样。1、MySQL的历史可以追溯到1979年,一个名为Monty Widenius的程序员在为TcX的小公司打工,并且用BASIC设计了一个报表工具,使其可以在4MHz主频和16KB内存的计算机上运行。当时,这只是一个很底层的且仅面向报表的存储引擎,名叫Unireg。
2、1990年,TcX公司的客户中开始有人要求为他的API提供SQL支持。Monty直接借助于mSQL的代码,将它集成到自己的存储引擎中。令人失望的是,效果并不太令人满意,决心自己重写一个SQL支持。
3、 1996年,MySQL 1.0发布,它只面向一小拨人,相当于内部发布。到了1996年10月,MySQL 3.11.1发布(MySQL没有2.x版本),最开始只提供Solaris下的二进制版本。一个月后,Linux版本出现了。在接下来的两年里,MySQL被依次移植到各个平台。
4、1999~2000年,MySQL AB公司在瑞典成立。Monty雇了几个人与Sleepycat合作,开发出了Berkeley DB引擎, 由于BDB支持事务处理,因此MySQL从此开始支持事务处理了。
5、2000,MySQL不仅公布自己的源代码,并采用GPL(GNU General Public License)许可协议,正式进入开源世界。同年4月,MySQL对旧的存储引擎ISAM进行了整理,将其命名为MyISAM。
6、2001年,集成Heikki Tuuri的存储引擎InnoDB,这个引擎不仅能持事务处理,并且支持行级锁。后来该引擎被证明是最为成功的MySQL事务存储引擎。MySQL与InnoDB的正式结合版本是4.0
7、2003年12月,MySQL 5.0版本发布,提供了视图、存储过程等功能。
8、2008年1月,MySQL AB公司被Sun公司以10亿美金收购,MySQL数据库进入Sun时代。在Sun时代,Sun公司对其进行了大量的推广、优化、Bug修复等工作。
9、2008年11月,MySQL 5.1发布,它提供了分区、事件管理,以及基于行的复制和基于磁盘的NDB集群系统,同时修复了大量的Bug。
10、2009年4月,Oracle公司以74亿美元收购Sun公司,自此MySQL数据库进入Oracle时代,而其第三方的存储引擎InnoDB早在2005年就被Oracle公司收购。
11、2010年12月,MySQL 5.5发布,其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常处理功能的支持,最重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎。MySQL 5.5不是时隔两年后的一次简单的版本更新,而是加强了MySQL各个方面在企业级的特性。Oracle公司同时也承诺MySQL 5.5和未来版本仍是采用GPL授权的开源产品。
MySQL由于它的开源性被广泛传播,也让更多的人了解到这个数据库。它的历史也富有传奇性。在这里仅是作为一个故事讲解了MySQL的发展史,在网上很多版本也会有不同。伴随着更多的技术开发人员加入到MySQL的开发中,不断完善,发展会越来越好。
Mysql社区版和企业版的区别● MySQL Community Server:Community是社区版本,开源免费,但不提供官方技术支持;
● MySQL Enterprise Edition:Enterprise企业版本,需付费,可以试用30天,提供官网技术支持;
企业版又分为4个商用版本:
- MySQL企业版
- MySQL标准本
- MySQL Cluster 运营商级版本
- MySQL Classic 版本
由于Oracle收购了MySQL,考虑到可能闭源或发展缓慢,所以开源市场发展出了其他的Mysql分支版本 目前市场最主流的三大Mysql版本:Mysql;MariaDB;percona
Mysql官方,被Oracle公司收购之后,产品一直比较稳定,商用的数据库 (稳定)
MariaDBMariaDb起源:
Mysql原作者,MariaDB更偏向于功能的完善-(尝新),MySQL之父Widenius先生离开了Sun之后,觉得依靠Sun/Oracle来发展MySQL,实在很不靠谱,于是决定另开分支,这个分支的名字叫做MariaDB。
MariaDB跟MySQL在绝大多数方面是兼容的,对于开发者来说,几乎感觉不到任何不同。目前MariaDB是发展最快的MySQL分支版本,新版本发布速度已经超过了Oracle官方的MySQL版本。
在Oracle控制下的MySQL开发,有两个主要问题:1. MySQL核心开发团队是封闭的,完全没有Oracle之外的成员参加。很多高手即使有心做贡献,也没办法做到。2. MySQL新版本的发布速度,在Oracle收购Sun之后大为减缓。Widenius有一个ppt,用数据比较了收购之前和之后新版本的发布速度。有很多bugfix和新的feature,都没有及时加入到发布版本之中。
以上这两个问题,导致了各个大公司,都开发了自己定制的MySQL版本,包括Yahoo!/Facebook/Google/阿里巴巴 淘宝网等等。
MySQL是开源社区的资产,任何个人/组织都无权据为己有。为了依靠广大MySQL社区的力量来更快速的发展MySQL,另外开分支是必须的。
Percona ServerPercona起源: Mysql原运维部总监,Percona公司更偏向于开发运维工具--性能调优,MySQL AB的创始人之一Monty Widenius和原来的MySQL AB工程师,现在的percona公司CEO联合组成一个新的开源数据库联盟,命名为:Alliance。这算是Oracle收购Sun后的一个反击,让大家看到了MySQL衍生品的后续发展前景
Mysql 基础架构- 一个系统可以有多个实例(实例等于cpu和内存的集合,也就是一个个等于一个Mysql)
- 一个实例可以有多个数据库
- 一个数据库可以有张表
- 一个表有很多键值(数据)
术语介绍
- 数据库: 数据库是一些关联表的集合。
- 数据表: 表是数据的矩阵。在一个数据库中的表看起来像一个简单的电子表格。
- 列: 一列(数据元素) 包含了相同类型的数据, 例如邮政编码的数据。
- 行:一行(=元组,或记录)是一组相关的数据,例如一条用户订阅的数据。
- 冗余:存储两倍数据,冗余降低了性能,但提高了数据的安全性。
- 主键:主键是唯一的。一个数据表中只能包含一个主键。你可以使用主键来查询数据。
- 外键:外键用于关联两个表。
- 复合键:复合键(组合键)将多个列作为一个索引键,一般用于复合索引。
- 索引:使用索引可快速访问数据库表中的特定信息。索引是对数据库表中一列或多列的值进行排序的一种结构。类似于书籍的目录。参照完整性: 参照的完整性要求关系中不允许引用不存在的实体。与实体完整性是关系模型必须满足的完整性约束条件,目的是保证数据的一致性。
架构图
- Connectors:指的是不同开发语言中与SQL的交互
- Management Serveices & utilities:系统管理和控制工具
- Connection Pool:连接池,管理缓存用户连接,线程处理需求
- SQL Interface:SQL接口,接受用户的SQL命令,并且返回用户查询需要的结果,比如select from就是调用SQL interface
- Parser:解释器,SQL命令传递到解释器的时候会被解释器验证和解析。解析器是有Lex和YACC实现的,是一个很长的脚本。主要功能:
- a.将sql语句分解成数据结构,并将这个结构传递到后续步骤,以后sql语句的传递和处理就是基于这个结构。
- b.如果在分解构成中遇到错误,那么就说明这个sql语句是不合理的
- Optimozer:查询优化器sql语句在查询之前会使用查询优化器对查询进行优化,他使用的是"选取-投影-联接“ 策略进行查询”
- caches&Buffers:查询缓存,如果查询缓存有命中的查询结果,查询语句就可以直接去查询缓存中取数据
- Pluggable Storage Engines:存储引擎 存储引擎是MySQL用什么表类型,也是MySQL最具有特色的一个地方。MySQL的存储引擎是插件式的,他根据mysql AB公司提供的文件访问层的一个抽象接口来定制一种文件访问机制(这个访问机制就叫做存储引擎)
File Syttem: Files & Logs:
- 参数文件:mysql实例启动的时候在哪里可以知道数据库文件,并且制定某些初始化参数,这些参数定义了,某种内存结果的大小等设置,还介绍了参数类型以及定义作用域,mysql实例启动时,会县杜曲配置参数文件的my.cnf。
- 日志文件:记录mysql对某种条件作出响应时候写入的文件,记录了影响mysql数据库的各种类型活动,常用的日志文件有错误日志、二进制日志、慢查询日志、全查询日志、redo日志、undo日志。
- 错误日志:错误日志对mysql的启动,运行、关闭过程进行了记录,问题分析必看
- 二进制日志:记录了对数据库进行变更的操作,但是不包括select操作以及show操作,主要用于恢复(recovery)、复制(replicatiuon)
- 慢查询日志:记录运行比较慢的sql语句信息,给sql语句的优化带来很好的帮助。
- 全查询日志:记录mysql所有的请求,数据库审计 问题排查跟踪性,损失3%-5%的性能
- rodo日志:数据看都是日志先行,先写日志,在写数据文件,保证恢复与完整性。
- undo日志:里面存储了与redo相反的数据更新操作,如果rollback的话,就把undo段里面数据回写到数据文件里面,这个对innodb存储引擎非常重要,因为他们记录了对于innodb存储引擎的事务日志。
- redo与undo他们并不是各自独立没有关系,他们是有关联的,交替合作来保证数据的一致性和安全性,
- socker文件:当用linux和mysql命令行窗口登录的时候需要的文件,linux系统下本地连接mysql可以采用linux域套接字socket方式,需要一个套接字socket发文件,可以有参数socket控制,一般默认在/tmp目录下
- pid文件:mysql实例的进程文件,当mysql实例启动的时候,会将自己的进程id写入一个文件中,该文件即为pid文件,有参数pid_file控制,默认路径位于数据库目录下
- mysql表结构文件:存放mysql表结构定义文件,如:.frm,.ibd
- 存储引擎文件:记录存储引擎信息的文件,innodb存储引擎在存储设计上模仿了Oracle,该文件就是默认的表空间文件,可以用多个文件组成一个表空间。