MySQL 由 My 和 SQL 组成,其中的 SQL 部分即为:Structured Query Language,意为结构化查询语⾔,是访问数据库的最常⻅的标准化语⾔。
MySQL 是一款优秀的、开源的数据库管理系统,同时 MySQL 也是一款可移植的数据库,几乎能在所有的主流系统上运行,如 Linux、Windows、Mac、Solaris 等。
关系型数据库和非关系型数据库
MySQL 也是一款关系型数据库。那么有关系数据库,自然也就有非关系型数据库,非关系型数据库也称之为 NoSQL 数据库,接下来我们分别看一下这两种数据库的特点:
关系型数据库特点:
-
关系型数据库以表格的形式存在,基于行来存储数据,是一个二维模式。
-
关系型数据库存储的是结构化数据,数据存储有固定模式,存储的数据需要适应表结构,也就是说定义好表结构之后,数据不能随意插入。
-
关系型数据库可以设置管理不同数据字段之间关系的规则,例如一对一、一对多、多对多等。
-
大部分关系型数据库都支持 SQL(结构化查询语言),而且都支持复杂的关联查询。
-
关系型数据库支持事务,通过事务的 ACID 特性严格或者实时保证数据的一致性。
当然,关系型数据库也存在一定的缺点,否则也就没有非关系型数据库什么事了,关系型数据库的缺点主要如下:
-
水平扩容不太友好,需要复杂的技术来支持,如分库分表等。
-
定义了严格的数据格式,因此存储的数据格式会受到限制,无法随意动态的插入不同格式的数据。
-
关系型数据库为了保证数据的持久性,一般会将数据持计划到磁盘,因此在高并发和海量数据场景下,读写性能会受到一定的影响。
而正因为关系型数据库有一定的缺点和局现象,所以有时候往往需要结合非关系型数据库来一起使用,非关系型数据库有以下特点:
-
非关系型数据库一般存储非结构化数据,比如文本,图片,音频等。
-
非关系型数据库的“表”之间没有关联关系,可扩展性强。
-
保证数据的最终一致性,遵循 BASE 理论。
-
高并发和海量数据场景下,仍然具有高效读写能力。
-
支持分布式,扩缩容简单。
分析了两种数据库的特点,不知道大家有没有一个想法就是能不能把这两种数据库的优点都结合起来呢?答案是可以的,目前已经有了所谓的 NewSQL,其结合了关系型数据库和非关系型数据库的部分优点,如 TiDB,VoltDB,ScaleDB 等
MySQL 的发展历史
-
MySQL 的 1.0 版本在 1996 发布,不过一般我们并不把这个时间作为 MySQL
的诞生点,因为这个版本的受众太少,并没有得到广泛的推广应用。 -
2001 年,MySQL 发布了 3.23 版本,这个版本可以认为是 MySQL 的诞生点。在这个版本中,MySQL 有比较大的改进就是采用 MyISAM 引擎替换了老旧而且有诸多限制的 ISAM 引擎,而且同时也可以支持 InnoDB 引擎,不过此时的InnoDB 并不在 MySQL 默认的二进制发行版本中,如果想要 InnoDB 引擎,需要手动编译。
-
2003 年,MySQL 发布了 4.0 版本,新增了一些高级特性和语法,而且和 InnoDB 引擎也正式“结合”了。
-
2005 年,发布了 4.1 版本,开始支持 UTF-8 字符集
-
2006 年,新增了视图,触发器和存储过程等企业级特性。
-
2008 年 1 月,MySQL AB 公司被 Sun 公司以 10 亿美金收购。
-
2008 年 11 月,Sun 发布了收购 MySQL 后的第一个版本
5.1,在这个版本引入了分区的概念,同时新增了基于行的复制功能,并移除了一些老旧引擎。 -
2009 年 4 月,Oracle 公司以 74 亿美元收购 Sun 公司,从此 MySQL 归属于 Oracle。
-
2010 年,Oracle 发布了收购 Sun 公司以来的第一个 MySQL 版本 5.5,这个版本开始 InnoDB 引擎正式成为
MySQL 的默认引擎。 -
2013 年,MySQL 发布了 5.6 版本,这个版本改进了 InnoDB 存储引擎,增加了全文索引能力。
-
2015 年,MySQL 发布了 5.7 版本,这个版本开始支持 json 数据类型。
-
2018 年,MySQL 发布了 8.0 版本,这个版本官方提供的数据是比 5.7 版本快 2 倍。
目前来说,最常用的还是 5.7 版本,当然,也有许多系统已经升级到 8.0 版本。
MySQL 逻辑架构
下图是 MySQL 的一个简易版的逻辑架构图:
从上图可以看到,MySQL 中分为了 Server 层和存储引擎层,这也是 MySQL 数据库相比较其他数据库的一个重要特点:插件式存储引擎。
所以在 MySQL 中,存储引擎是基于单张表来定义的,而不是基于整个数据库,也就是说我们可以给每一张表定义不同的存储引擎,Server 层最终通过调用存储引擎层的接口来实现一系列操作。
关于这张图我们后续实验中还会陆续深入分析,希望大家能牢记这张简图,这对理解 MySQL 会有极大帮助。
MySQL 存储引擎介绍
MySQL 中的存储引擎是插拔式的,我们可以自由选择合适的存储引擎。
-
InnoDB 引擎
InnoDB 从 MySQL 5.5 开始成为了 MySQL 默认的存储引擎,大部分情况下,我们都会选择这个引擎。InnoDB 支持事务,它具有提交、回滚和崩溃恢复等能力来保护用户数据。其内部采用 MVCC 机制来实现高并发,支持行级锁,实现了 SQL 92 的四个标准隔离级别。为了保证数据的完整性,InnoDB 引擎还支持外键引用来实现完整性约束。
-
MyISAM 引擎
在 MySQL 5.1 及之前的版本,MyISAM 都是默认的存储引擎。MYISAM 引擎不支持事务和行级锁,其设计简单,数据以紧密格式存储,在某些场景如果可以忍受数据丢失(比如日志收集),那么也可以考虑使用 MyISAM 引擎。MyISAM 引擎拥有较高的插入和查询速度。
-
Memory 引擎
Memory 引擎所有的数据都保存在内存中,所以其速度是非常快的,不过因为其数据保存在内存中,重启之后数据会全部丢失(表结构不会丢失)。Memory 引擎表可以用于缓存,因为其支持 Hash 索引,所以查找速度非常快,但是 Memory 表也只支持表级锁,因此并发的写入性能比较低。
-
CSV 引擎
CSV 引擎可以将普通的 CSV 文件作为 MySQL 表来存储,不过需要注意的是,其不支持索引。
-
Archive 引擎
这种引擎只支持 insert 和 select 两种操作,而且其在 5.1 版本之前也不支持索引。Archive 引擎会利用 zlib 算法对插入的数据进行压缩,所以正如其名字一样,比较适合于存储归档数据,比如日志和数据采集类应用。
-
Federated 引擎
Federated 引擎本身并不存储数据,仅仅起到了一个代理作用,它会创建一个远程到 MySQL 服务器的客户端连接,并将查询传输到远程服务器执行,该引擎默认是被禁用的。
-
其他引擎
除了上面介绍的这些存储引擎之外,MySQL 其实还有非常多的引擎,比如:Maria 引擎,Blackhole 引擎,Merge 引擎等等,还有 NDB 集群引擎,以及一些第三方引擎等。在索引的存储引擎中,最关键的就是 InnoDB 和 MyISAM 两种引擎,这也是一道高频面试题,关于这两种引擎,后续文章中还会结合索引来更深入的介绍其特性。
如何选择存储引擎
-
如果业务系统中对数据要求比较高,且需要支持事务,那么 InnoDB 是不错的选择。
-
如果业务系统中查询多,更新少,而且对查询性能要求比较高,可以选择 MyISAM 引擎。
-
如果业务系统中在查询中有建立临时表的需求,那么可以考虑使用 Memory 引擎。
需要说明的是,既然 MySQL 中支持这么多存储引擎,所以其自然是有定义规范的,也就是说,只要满足一定规范,而团队实力又强的话,我们也可以考虑开发自己的存储引擎,开发自己的存储引擎需要使用 C 语言进行编写,规范可以参考这里