五分钟速成MySQL基础

发表时间: 2019-01-07 23:53

最近,Oracle与亚马逊AWS风波不断。AWS要弃用Oracle,MySQL要挺大梁。而Oracle 首席技术官兼董事长 Larry Ellison 则公开表达了对自家 MySQL 的嫌弃,他告诉分析师:“要使用 MySQL,就必须放弃 Oracle 的大部分可靠性、安全性和性能,因为我们拥有巨大的技术优势”。 Ellison同时拥有全球第一大主流数据库Oracle和第二大主流数据库MySQL,可谓风光无限,可为了抨击AWS,不惜贬低自家MySQL,只能说MySQL实在是太成功了。我们不妨一同回顾一下大名鼎鼎的MySQL的传奇吧。

1. MySQL简史

  • 1995年,Michael Monty Widenius、David Axmark和 Allan Larsson,在瑞典创立了MySQL AB公司。1996年,发布MySQL 1.0版本,“My”取自联合创始人Micheal Monty Widenius女儿的名字。同年10月,MySQL 3.11.1发布,没有2.x版本。
  • 2000年,MySQL对原存储引擎进行了整理,命名为MyISAM
  • 2001年,MySQL集成Heikki Tuuri的存储引擎InnoDB,实现了事务处理和行级锁的支持。该年发布的3.23 版本已支持大多数的基本的SQL 操作,并集成了MyISAM和InnoDB 存储引擎。
  • 2003年3月,发布MySQL 4.0 ,支持查询缓存、集合并、全文索引,正式支持InnoDB存储引擎。
  • 2004年10月,发布经典的MySQL 4.1 ,增加了子查询,utf8字符集等。
  • 2005年10月,发布MySQL 5.0 ,增加了视图、存储过程、游标、触发器、分布式事务,迈出了高性能数据库步伐。
  • 2008年1月,MySQL AB公司被Sun公司以10亿美金收购。
  • 2009年4月,Oracle公司以74亿美元收购Sun公司,MySQL转入Oracle麾下。
  • 2010年12月,发布MySQL 5.5 ,增加了半同步复制、信号异常处理、unicode字符集,InnoDB成为默认存储引擎。
  • 2011年4月,发布MySQL 5.6 ,增加了GTID复制,支持延时复制、行级复制。
  • 2013年2月,发布MySQL 5.7 ,支持原生JSON数据类型。
  • 2016年9月,发布MySQL 8.0.0 ,速度要比 MySQL 5.7 快 2 倍;可使用JSON数据的SQL机制;支持GIS;可靠性更高。
  • 2018年4月,发布MySQL 8.0.11 GA ,支持NoSQL文档存储、原子的奔溃安全DDL语句、扩展JSON语法,新增JSON表函数,改进排序、分区更新功能。

2. MySQL的主要特点

MySQL采用C和C++编写,开源多线程,是完整的关系数据库管理系统(RDBMS),主要特点如下。

  • 标准SQL:支持完整的SQL标准化语言。
  • 易用性:使用简单,内嵌数据库管理客户端,具有交互性。
  • 安全性:具有可靠的数据安全层,可为数据提供高效的加密。
  • 可伸缩性:可处理大量数据而不卡顿--多达5000万行。可以处理高达8TB的数据。
  • 跨平台性:兼容几乎所有操作系统,如UNIX,Windows,Linux,MAC OS X等。
  • 灵活高效、高性能:提供更快速、高度可靠且廉价的存储解决方案,支持大量嵌入式应用程序。
  • 双重许可:用户可以选择GNU许可作为开源软件使用,也可以购买有Oracle许可证的商业软件。

3. MySQL系统架构

Mysql由SQL接口,解析器,优化器,缓存,存储引擎组成,系统架构图如下。

MySQL系统架构

4. 主流的数据库存储引擎简介

MyISAM是MySQL 5.5版之前的默认数据库引擎,虽然性能极佳,但却有一个缺点:不支持事务处理。随着另一种数据库引擎InnoDB的导入,MyISAM被逐渐取代。

InnoDB是MySQL目前最流行的数据库引擎,与MyISAM相比,InnoDB的最大特色就是支持了ACID兼容的事务功能。

TokuDB是一种采用压缩算法的存储引擎,大量测试表明,数据表从 InnoDB 存储引擎转到 TokuDB 存储引擎后,数据量可以减少 80% 到 90%,即 1T 的数据量能压缩到 200G以下。除了数据压缩外,TokuDB 存储引擎还支持事务和在线 DDL 操作,可以很好兼容 MyISAM 或 InnoDB 存储引擎上的应用。缺点是无法支持外键 Foreign Key,不适用于频繁大量读取的场景。

5. Mysql存储极限

最大文件:参考MyISAM存储引擎的技术文档,该引擎可以支持最大256TB的文件(63位文件长度)。

最大行数:虽然理论上单表中可支持 (2^32)^2,约1.844E+19行记录,但实际行数上限还受myisam_data_pointer_size参数限制,64位的mysql通常是6,即48位,行数是2^48 - 1

极限测试:有用户用mysql存储了 20万张表,50亿行记录,但不知道执行效率咋样。

《高可用架构》一书中提到了“单表60亿记录”的极端case,使用TokuDB替换InnoDB引擎后,单表容量从1.2TB压缩到了80GB,值得参考。

6. 结束语

MySQL转入Oracle后,Oracle投入大量人力物力对代码进行了重构和优化,实质提高了MySQL的性能和稳定性,而且功能越来越丰富,前景并不像某些媒体担忧的那样悲观。后续文章,笔者将聚焦MySQL在云计算中的青春活力,敬请关注。