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项目的理念是抛弃向后兼容的束缚,而这意味着相对于迁移一个已有的应用而言,它更适合新的应用开发。

MySQL笔记01: MySQL入门_1.1 MySQL概述的更多相关文章

  1. Redis 笔记 01:入门篇

    Redis 笔记 01:入门篇 ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ★ ...

  2. MySQL笔记(七)远程连接MySQL

    mysql 默认只允许 localhost 连接,因此在远程连接服务器上的 mysql 之前,需要做一些设置.在没有设置前,默认是下面的状况,mysql 只能由 localhost(127.0.0.1 ...

  3. MySQL第01课- CentOS + 单实例MySql编译安装总结

    2016年2月,从oracle转向MySql ,碰上几个坑,特此记录 总结 1.注意环境变量.配置文件,操作过程不能出错 2.相比rpm方式安装,编译安装方式可以指定安装路径,再说安装是简单活,将来安 ...

  4. MySql笔记01

    用了两天的时间终于把MySql安装好了,还是很麻烦的,之所以没有选择直接安装,使用的是免安装版本,主要是想了解这个数据库的配置,这样以后就可以更好的了解它了. 登录MySql:mysql –h loc ...

  5. mysql笔记01 MySQL架构与历史、Schema与数据类型优化

    MySQL架构与历史 1. MySQL架构推荐参考:http://www.cnblogs.com/baochuan/archive/2012/03/15/2397536.html 2. MySQL会解 ...

  6. MySQL笔记 01

    STRUCTURE QUERY LANGUAGE 数据库CRUD操作 DDL: 数据库定义语言,定义数据库数据表结构 CREATE(创建): 创建数据库 CREATE DATABASE 数据库名字; ...

  7. MySQL笔记01(黑马)

    一.数据库基本介绍 目标:了解数据库的功能和常见数据库分类.数据库产品 数据库基本知识 数据库分类 SQL简介 MySQL访问 1.数据库基本知识 目标:了解数据库的概念和数据库的作用 概念 数据库: ...

  8. MySQL 笔记 —— 中文乱码解决、修改mysql服务端编码

    https://blog.csdn.net/qq_19865749/article/details/79235422

  9. MongoDB学习笔记01:入门

    MongoDB简介 MongoDB是一个开源.高性能.无模式的文档型数据库,当初的设计就是用于简化开发和方便扩展,是NoSQL数据库产品中的一种.是最 像关系型数据库(MySQL)的非关系型数据库. ...

  10. java学习笔记-01.对象入门

    1.面向对象编程简称是OOP. 2.继承是通过 extends关键字实现的,接口是通过implements关键字实现的. 3.public:意味着后续的定义任何人均可使用. private:意味着除了 ...

随机推荐

  1. C#利用Refit实现JWT自动续期

    前言 笔者之前开发过一套C/S架构的桌面应用,采用了JWT作为用户的登录认证和授权.遇到的唯一问题就是JWT过期了该怎么办?设想当一个用户正在进行业务操作,突然因为Token过期失效,莫名其妙地跳转到 ...

  2. 4.4 C++ Boost 数据集序列化库

    Boost 库是一个由C/C++语言的开发者创建并更新维护的开源类库,其提供了许多功能强大的程序库和工具,用于开发高质量.可移植.高效的C应用程序.Boost库可以作为标准C库的后备,通常被称为准标准 ...

  3. python列表的增删

    list = [1, 2, 3, 4]# 打印后两位print(list[-2:])# 打印前2位print(list[:2])# 修改列表元素list[0] = 5print(list)# 添加元素 ...

  4. 开源 SD-Small 和 SD-Tiny 知识蒸馏代码与权重

    最近,人工智能社区在开发更大.更高性能的语言模型方面取得了显著的进展,例如 Falcon 40B.LLaMa-2 70B.Falcon 40B.MPT 30B; 以及在图像领域的模型,如 SD2.1 ...

  5. 当开源项目 Issue 遇到了 DevChat

    目录 1. 概述 2. Bug 分析与复现 3. Bug 定位与修复 4. 代码测试 5. 文档更新 6. 提交 Commit 7. 总结 1. 概述 没错,又有人给 GoPool 项目提 issue ...

  6. 「codeforces - 868F」Yet Another Minimization Problem

    link. 值域分治优化决策单调性 DP 的 trick.朴素做法 trivial,不赘述. 考虑求取一个区间 \([l,r]\) 的 DP 值.先搞定在 \(m=\lfloor\frac{l+r}{ ...

  7. 聊聊wireshark的进阶使用功能

    1. 前言 emmm,说起网络知识学习肯定离不来wireshark工具,这个工具能够帮助我们快速地定位网络问题以及帮助正在学习网络协议这块的知识的同学验证理论与实际的一大利器,平时更多的只是停留在初步 ...

  8. MySQL到TiDB:Hive Metastore横向扩展之路

    作者:vivo 互联网大数据团队 - Wang Zhiwen 本文介绍了vivo在大数据元数据服务横向扩展道路上的探索历程,由实际面临的问题出发,对当前主流的横向扩展方案进行了调研及对比测试,通过多方 ...

  9. 基于 Canal 设计可扩展、高可用 binlog 同步集群

    问题 https://github.com/alibaba/canal binlog 同步组件,canal 使用是比较广泛的,canal 逻辑架构如图: 部署架构如图: canal 基于主从模式,任务 ...

  10. 探究——C# .net 代码混淆/加壳

    背景: 保密. 过程: 先查询一下常见的加壳工具: DotFuscator,官方自带,据说免费版混淆程度不高 Virbox Protector,很好很优秀,但是收费 NET Reactor,可能会被识 ...