1.1 MySQL概述
MySQL是一个关系数据库管理系统(Relational DataBase Management System,RDBMS)。它是一个程序,可以存储大量的种类繁多的数据,并且提供服务以满足任何组织的需要。与MySQL同属于RDBMS的还有著名的Oracle、SQL Server和DB2。
1.1.1 MySQL发展历史
MySQL的历史最早可以追溯到1979年,当时有一个名叫Monty Widenius的程序员在名为TcX的小公司打工,并且使用BASIC设计了一个报表工具,使其可以在4MB主频和16KB内存的计算机上运行。没过多久,Monty又将此工具用C语言进行了重写并移植到了UNIX平台。当时,这只是一个很底层的且仅面向报表的存储引擎,名叫Unireg。
1985年,瑞典几位志同道合的年轻人(以David Axmark为首)成立了一家公司,这就是MySQL AB 的前身。这个公司最初并不是为了开发数据库产品,而是在实现他们想法的过程中,需要一个数据库。他们希望能够使用开源的产品。但在当时并没有一个合适的选择,那就只能自己开发了。
在最初,他们只是自己设计了一个利用索引顺序存取数据的方法,也就是I S A M(Indexed Sequential Access Method)存储引擎核心算法的前身,利用ISAM结合mSQL来实现他们的应用需求。在系统使用过程中,随着数据量越来越大,系统复杂度越来越高,ISAM和mSQL的组合逐渐不堪重负。在分析性能瓶颈之后,他们发现问题出在mSQL上面。不得已,他们抛弃了mSQL,重新开发了一套功能类似的数据存储引擎,这就是ISAM 存储引擎。
1990年,TcX公司的客户中开始有人要求为他的API提供SQL支持。当时有人提议直接使用商用数据库,但是Monty觉得商用数据库的速度难以令人满意。于是,他直接借助于MySQL的代码,将它集成到自己的存储引擎中。令人失望的是,效果并不太令人满意,于是,Monty决心自己重写一个SQL支持。
1996年,MySQL 1.0版本发布,可以在小范围内使用。到了1996年10月,MySQL 3.11.1版本发布,没有2.x版本,最开始只提供了Solaris下的二进制版本。一个月后,Linux版本出现了。这时的MySQL还非常简陋,除了在一个表上做一些INSERT、UPDATE、DELETE和SELECT操作外,没有其他更多的功能。
紧接下来的两年里,MySQL被依次移植到各个平台。它在发布时采用的许可策略有些与众不同:允许免费使用,但是不能将MySQL与自己的产品绑定在一起发布。如果想一起发布,就必须使用特殊许可,这就意味着用户要“付费”。这种特殊许可为MySQL带来了一些收入,从而为它的持续发展提供了物质基础。
MySQL关系型数据库于1998年1月发行第一个版本。它使用系统核心的多线程机制提供完全的多线程运行模式,提供了面向C、C++、Eiffel、Java、Perl、PHP、Python以及Tcl等编程语言的编程接口(API)。支持多种字段类型,并提供了完整的操作符支持。
1999—2000年,MySQL AB公司在瑞典成立。Monty与Sleepycat合作开发出了Berkeley DB(简称为BDB)引擎,由于BDB支持事务处理,所以MySQL从此开始支持事务处理了。
2000年的时候,MySQL公布了自己的源代码,并采用GPL(GNU General Public License)许可协议,正式进入开源世界。2000年4月,MySQL对旧的存储引擎ISAM进行了整理,将其命名为MyISAM。
2001年,Heikiki Tuuri向MySQL提出建议,希望能集成他们的存储引擎InnoDB,这个引擎同样支持事务处理,还支持行级锁。所以在2001年发布的3.23版本的时候,该版本已经支持大多数的基本的SQL操作,而且还集成了MyISAM和InnoDB存储引擎。MySQL与InnoDB的正式结合版本是4.0。
2004年10月,发布了经典的4.1版本。
2005年10月,有发布了里程碑的一个版本,MySQL 5.0 在5.0中加入了游标、存储过程、触发器、视图和事务的支持。在5.0之后的版本里,MySQL明确地表现出迈向高性能数据库的发展步伐。
2008年1月,MySQL AB公司被Sun公司以10亿美金收购,MySQL数据库进入Sun时代。在Sun时代,Sun公司对其进行了大量的推广、优化和Bug修复等工作。
2008年11月,MySQL 5.1发布,它提供了分区、事件管理,以及基于行的复制和基于磁盘的NDB集群系统,同时修复了大量的Bug。
2009年4月,甲骨文以74亿美元收购Sun公司,自此MySQL数据库进入Oracle时代,而其第三方的存储引擎InnoDB早在2005年就被甲骨文收购。
2010年12月,MySQL 5.5发布,其主要新特性包括半同步的复制及对SIGNAL/RESIGNAL的异常处理功能的支持,最重要的是InnoDB存储引擎终于变为当前MySQL的默认存储引擎。MySQL 5.5不是时隔两年后的一次简单的版本更新,而是加强了MySQL各个方面在企业级的特性。甲骨文公司同时也承诺MySQL 5.5和未来版本仍是采用GPL授权的开源产品。
1.1.2 MySQL主要特性
下面列出了MySQL数据库的一些主要特性。
(1)内部构件和可移植性。
(2)使用C和C++编写。
(3)用众多不同的编译器进行了测试。
(4)能够工作在众多不同的平台上。
(5)使用GNU Automake、Autoconf和Libtool进行移植。
(6)提供了用于C、C++、Eiffel、Java、Perl、PHP、Python、Ruby和Tcl的API。
(7)采用核心线程的完全多线程,如果有多个CPU,它能方便地使用这些CPU。
(8)提供了事务性和非事务性存储引擎。
(9)使用了极快的“B树”磁盘表(MyISAM)和索引压缩。
(10)添加另一个存储引擎相对简单。如果打算为内部数据库添加一个SQL接口,该特性十分有用。
(11)极快的基于线程的内存分配系统。
(12)通过使用优化的“单扫描多连接”,能实现极快的连接。
(13)存储器中的哈希表用作临时表。
(14)SQL函数是使用高度优化的类库实现的,运行很快。通常,在完成查询初始化后,不存在存储器分配。
(15)服务器可作为单独程序运行在客户/服务器联网环境下。它也可作为库提供,可嵌入(链接)到独立的应用程序中。这类应用程序可单独使用,也能在网络环境下使用。
(16)众多类型:
带符号/无符号整数,1、2、3、4、8字节长,FLOAT,DOUBLE,CHAR,VARCHAR,TEXT,BLOB,DATE,TIME,DATETIME,TIMESTAMP,YEAR,SET,ENUM,以及OpenGIS空间类型。
(17)在SELECT查询的WHERE子句中,提供完整的操作符和函数支持。例如:
mysql> SELECT CONCAT(first_name, ' ', last_name) -> FROM citizen -> WHERE income/dependents > 10000 AND age > 30;
(18)对SQL GROUP BY和ORDER BY子句的全面支持。支持聚合函数COUNT(),COUNT(),AVG(),STD(),SUM(),MAX()和MIN()等。
(19)支持LEFT OUTER JOIN和RIGHT OUTER JOIN,采用标准的SQL和ODBC语法。
(20)MySQL的SHOW命令可用于检索关于数据库、数据库引擎、表和索引的信息。EXPLAIN命令可用于确定优化器处理查询的方式。
(21)函数名与表名或列名不冲突。例如,ABS是有效的列名。唯一的限制在于,调用函数时,函数名和随后的符号“(”之间不得有空格。
(22)十分灵活和安全的权限和密码系统,允许基于主机的验证。连接到服务器时,所有的密码传输均采用加密形式,从而保证了密码安全。
(23)处理大型数据库:
有用户使用MySQL服务器包含5千万条记录的数据库,有些用户将MySQL用于包含60000个表和约50亿行的数据库。
(24)每个表可支持高达64条索引(在MySQL 4.1.2之前为32条)。每条索引可由1~16个列或列元素组成。最大索引宽度为1000字节(在MySQL 4.1.2之前为500)。索引可使用具备CHAR、VARCHAR、BLOB或TEXT列类型的列前缀。
(25)在任何平台上,客户端可使用TCP/IP协议连接到MySQL服务器。在Windows系统的NT系列中(NT、2000、XP或2003),客户端可使用命名管道进行连接。在UNIX系统中,客户端可使用UNIX域套接字文件建立连接。
(26)对数种不同字符集的全面支持,包括latin1(cp1252)、german、big5、ujis等。例如,在表名和列名中允许使用斯堪的纳维亚字符‘å’、‘ä’和‘ö’。从MySQL 4.1开始,提供了Unicode支持。
(27)所有数据均以所选的字符集保存。正常字符串列的比较不区分大小写。
(28)MySQL服务器提供了对SQL语句的内部支持,可用于检查、优化和修复表。通过mysqlcheck客户端,可在命令行上使用这类语句。MySQL还包括myisamchk,这是一种很快的命令行实用工具,可用于在MyISAM表上执行这类操作。
(29)对于所有MySQL程序,均能通过“--help”或“-?”选项调用,以获取联机帮助信息。
1.1.3 MySQL适用场景
目前,MySQL的使用用户已经达千万级别了,其中不乏企业级用户。可以说是目前最为流行的开源数据库管理系统软件了。任何产品都不可能是万能的,也不可能适用于所有的应用场景。下面列举了MySQL最常用到的4种场景。
1. Web网站系统
Web站点是MySQL最大的客户群,也是MySQL发展史上最为重要的支撑力量。MySQL之所以能成为Web站点开发者们最青睐的数据库管理系统,是因为MySQL数据库的安装和配置都非常简单,使用过程中的维护也不像很多大型商业数据库管理系统那么复杂,而且性能出色。还有一个非常重要的原因就是MySQL是开放源代码的,完全可以免费使用。
2. 日志记录系统
MySQL数据库的插入和查询性能都非常高效,如果设计得较好,在使用MyISAM存储引擎的时候,两者可以做到互不锁定,达到很高的并发性能。所以,对需要大量的插入和查询日志记录的系统来说,MySQL是非常不错的选择。比如处理用户的登录日志、操作日志等,都是非常适合的应用场景。
3. 数据仓库系统
随着现在数据仓库数据量的飞速增长,需要的存储空间越来越大。数据量的不断增长,使数据的统计分析变得越来越低效,也越来越困难。怎么办?这里有几个主要的解决思路,一个是采用昂贵的高性能主机以提高计算性能,用高端存储设备提高I/O性能,效果理想,但是成本非常高;第二个就是通过将数据复制到多台使用大容量硬盘的廉价服务器上,以提高整体计算性能和I/O能力,效果尚可,存储空间有一定限制,成本低廉;第三是通过将数据水平拆分,使用多台廉价的服务器和本地磁盘来存放数据,每台机器上面都只有所有数据的一部分,解决了数据量的问题,所有服务器一起并行计算,也解决了计算能力问题,通过中间代理程序调配各台机器的运算任务,既可以解决计算性能问题又可以解决I/O性能问题,成本也很低廉。
在上面的三个方案中,第二和第三个的实现MySQL都有较大的优势。通过MySQL的简单复制功能,可以很好地将数据从一台主机复制到另外一台,不仅在局域网内可以复制,在广域网同样可以。当然,很多人可能会说,其他的数据库同样也可以做到,不是只有MySQL有这样的功能。确实,很多数据库同样能做到,但是MySQL是免费的,其他数据库大多都是按照主机数量或者CPU数量来收费,当我们使用大量的服务器的时候,授权费用相当惊人。第一个方案,基本上所有数据库系统都能够实现,但是其高昂的成本并不是每一个公司都能够承担的。
4. 嵌入式系统
嵌入式环境对软件系统最大的限制是硬件资源非常有限,在嵌入式环境下运行的软件系统,必须是轻量级低消耗的软件。MySQL在资源使用方面的伸缩性非常大,可以在资源非常充裕的环境下运行,也可以在资源非常少的环境下正常运行。它对于嵌入式环境来说,是一种非常合适的数据库系统,而且MySQL有专门针对于嵌入式环境的版本。
1.1.4 MySQL分支版本
在MySQL的发展中最初由MySQL AB公司开发,之后被Sun公司收购,再被Oracle公司收购。另外,由于MySQL开源代码的原因,市场上出现了很多MySQL的分支版本,其中最有代表性的三个,分别是Percona Server、MariaDB和Drizzle。
1. Percona Server
Percona Server是一个与MySQL向后兼容的替代品,它尽可能不改变SQL语法、客户/服务器协议和硬盘上的文件格式。任何运行在MySQL上的数据库都可以运行在Percona Server上而不需要修改。切换到Percona Server的方法也很简单,只需关闭MySQL和启动Percona Server即可,而不需要导出和重新导入数据,反之切换回去也不麻烦。
Percona Server包括Percona XtraDB存储引擎,即改进版本的InnoDB。这同样是一个向后兼容的替代品。例如,如果要创建一个使用InnoDB存储引擎的表,Percona Server能自动识别并用XtraDB替代之。
2. MariaDB
在Sun收购MySQL之后,MySQL的创建者之一Monty离开Sun公司,随后成立Monty公司创建了MariaDB。MariaDB的目标是社区开发,Bug修改和许多的新特性(特别是与社区开发的特性相集成)。
与Percona Server相比,MariaDB包括更多对服务器的扩展。例如,有许多是对查询优化和复制的改变。它使用Aria存储引擎取代了MyISAM来存储内部临时表。同时也包括很多社区的引擎,如SphinxSE和PBXT。
3. Drizzle
Drizzle是真正的MySQL分支,而非只是一个变种或者增强版本。它并不与MySQL兼容,尽管区分上还并不是太大。在许多场合并不能简单地将MySQL替换为Drizzle,因为后者对SQL语法的修改太大了。
Drizzle创建于2008年,致力于更好地服务MySQL用户。其创建目标是更好地满足网页应用的核心功能。与MySQL相比,它更加简单,选择更少。例如,只能使用utf8作为字符集,并且只有一个类型的BLOB,主要针对64位硬件编译,且支持IPv6网络等。
在代码层,Drizzle构建于一个精简内核和插件的微核心架构之上。服务器的核心比起MySQL已经精简许多。几乎任何东西都是以插件形式使用。Drizzle使用了诸如Boost的标准开源库,并遵从代码、架构和API方面的标准。
目前,Drizzle虽然已经在某些产品环境下部署但还没有广泛应用。Drizzle项目的理念是抛弃向后兼容的束缚,而这意味着相对于迁移一个已有的应用而言,它更适合新的应用开发。
标签:存储,01,1.1,数据库,使用,引擎,版本,MySQL From: https://www.cnblogs.com/LaytonWang/p/17058812.html