MySQL数据库的深度解析

发表时间: 2019-09-26 07:30

前言

数据库,顾名思义,是存放数据的仓库。它的存储空间很大,可以存放百万条、千万条、上亿条数据。但是数据库并不是随意地将数据进行存放,是有一定的规则的,否则查询的效率会很低。当今世界是一个充满着数据的互联网世界,充斥着大量的数据。即这个互联网世界就是数据世界。数据的来源有很多,比如出行记录、消费记录、浏览的网页、发送的消息等等。除了文本类型的数据,图像、音乐、声音都是数据。

而我们常说的数据库实际上是指管理数据库的软件系统,即数据库管理系统(DBMS),而这也是我们常说的关系型数据库

数据库管理系统(Database Management System)是一种操纵和管理数据库的大型软件,用于建立、使用和维护数据库,简称DBMS。它对数据库进行统一的管理和控制,以保证数据库的安全性和完整性。用户通过DBMS访问数据库中的数据,数据库管理员也通过dbms进行数据库的维护工作。它可使多个应用程序和用户用不同的方法在同时或不同时刻去建立,修改和询问数据库。大部分DBMS提供数据定义语言DDL(Data Definition Language)和数据操作语言DML(Data Manipulation Language),供用户定义数据库的模式结构与权限约束,实现对数据的追加、删除等操作。

目前主流的数据库管理系统有:Oracle、MySQL、SQL Server、MariaDB、PostgreSQL、DB2和Sybase等。

本文主要介绍MySQL。

MySQL介绍

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,目前属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。

自甲骨文公司收购MySQL之后,MySQL在商业数据库与开源数据库领域的市场占有份额都跃居第一,这样的格局引起了部分业内人士的担忧,因为商业数据库的老大有可能将MySQL闭源,为了避免Oracle将MySQL闭源,而无开源的类MySQL数据库可用,MySQL社区采用了分支的方式——MariaDB数据库就这样诞生了,MariaDB是一个向后兼容的数据库产品,可能会在以后替代MySQL。

不过,这里还是建议大家选择更稳定且使用更广泛的MySQL数据库,可以先测试MariaDB数据库,等使用的人员多一些,社区更活跃后再正式考虑使用也不迟。

MySQL的特性和优劣势

MySQL的特性

使⽤C和C++编写,并使⽤了多种编译器进⾏测试,保证源代码的可移植性

⽀持多种操作系统,如Linux、Windows、AIX、FreeBSD、HP-UXMacOS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris等

为多种编程语⾔提供了API,如C、C++、Python、Java、Perl、PHP、Eiffel、Ruby等

⽀持多线程,充分利⽤CPU资源

优化的SQL查询算法,有效地提⾼查询速度

提供多语⾔⽀持,常⻅的编码如GB2312、BIG5、UTF8

提供TCP/IP、ODBC和JDBC等多种数据库连接途

提供⽤于管理、检查、优化数据库操作的管理⼯具

⼤型的数据库。可以处理拥有上千万条记录的⼤型数据库

⽀持多种存储引擎

MySQL 软件采⽤了双授权政策,它分为社区版和商业版,由于其体积⼩、速度快、总体拥有成本低,尤其是开放源码这⼀特点,⼀般中⼩型⽹站的开发都选择MySQL作为⽹站数据库

MySQL使⽤标准的SQL数据语⾔形式

Mysql是可以定制的,采⽤了GPL协议,你可以修改源码来开发⾃⼰的Mysql系统

在线DDL更改功能

复制全局事务标识

复制⽆崩溃从机

复制多线程

还有最重要的一点是:开源 免费 不要钱 使⽤范围⼴,跨平台⽀持性好,提供了多种语⾔的调⽤API

MySQL常用引擎及其优缺点:

MySQL的常用存储引擎有:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)等,最常用的是MyISAM与InnoDB两个引擎 。

InnoDB 引擎(MySQL5.5以后默认使用)

  • 灾难恢复性好
  • 支持事务
  • 使用行级锁
  • 支持外键关联
  • 支持热备份
  • 对于InnoDB引擎中的表,其数据的物理组织形式是簇表(Cluster Table),主键索引和数据是在一起的,数据按主键的顺序物理分布
  • 实现了缓冲管理,不仅能缓冲索引也能缓冲数据,并且会自动创建散列索引以加快数据的获取
  • 支持热备份

MyISAM引擎

  • 不支持事务
  • 使用表级锁,并发性差
  • 主机宕机后,MyISAM表易损坏,灾难恢复性不佳
  • 可以配合锁,实现操作系统下的复制备份、迁移
  • 只缓存索引,数据的缓存是利用操作系统缓冲区来实现的。可能引发过多的系统调用且效率不佳
  • 数据紧凑存储,因此可获得更小的索引和更快的全表扫描性能

MEMORY 存储引擎

  • 提供内存表,也不支持事务和外键。显著提高访问数据的速度,可用于缓存会频繁访问的、可以重构的数据、计算结果、统计值、中间结果。
  • 使用表级锁,虽然内存访问快,但如果频繁的读写,表级锁会成为瓶颈
  • 只支持固定大小的行。Varchar类型的字段会存储为固定长度的Char类型,浪费空间
  • 不支持TEXT、BLOB字段。当有些查询需要使用到临时表(使用的也是MEMORY存储引擎)时,如果表中有TEXT、BLOB字段,那么会转换为基于磁盘的MyISAM表,严重降低性能
  • 由于内存资源成本昂贵,一般不建议设置过大的内存表,如果内存表满了,可通过清除数据或调整内存表参数来避免报错
  • 服务器重启后数据会丢失,复制维护时需要小心

MySQL存储引擎MyISAM与InnoDB如何选择

  • 1)InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。
  • 2)MyISAM适合查询以及插入为主的应用,InnoDB适合频繁修改以及涉及到安全性较高的应用
  • 3)InnoDB支持外键,MyISAM不支持
  • 4)从MySQL5.5.5以后,InnoDB是默认引擎
  • 5)InnoDB不支持FULLTEXT类型的索引
  • 6)InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表。
  • 7)对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引。
  • 8)清空整个表时,InnoDB是一行一行的删除,效率非常慢。MyISAM则会重建表。
  • 9)InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'

MySQL集群-高可用、负载均衡架构

MySQL是一款开源的关系数据库产品,行业内大多对于MySQL的认知都是只能做小项目应用场景,适合中小企业。那么MySQL到底能否支持大型场景应用呢?

我们接下来介绍MySQL的大型场景应用,集群。

高可用架构对于互联网服务基本是标配,无论是应用服务还是数据库服务都需要做到高可用。对于一个系统而言,可能包含很多模块,比如前端应用,缓存,数据库,搜索,消息队列等,每个模块都需要做到高可用,才能保证整个系统的高可用。对于数据库服务而言,高可用可能更复杂,对用户的服务可用,不仅仅是能访问,还需要有正确性保证,因此数据库的高可用方案是一直以来的讨论热点,今天就各种的高可用方案,谈一下个人的一些看法,如有错误,还请指正!!

在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面:

  • 如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断。
  • 用作备份、只读副本等功能的非主节点的数据应该和主节点的数据实时或者最终保持一致。
  • 当业务发生数据库切换时,切换前后的数据库内容应当一致,不会因为数据缺失或者数据不一致而影响业务。

关于对高可用的分级在这里我们不做详细的讨论,这里只讨论常用高可用方案的优缺点以及高可用方案的选型。

主从或主主半同步复制

此种架构,一般初创企业比较常用,也便于后面步步的扩展。

通常会和proxy、keepalived等第三方软件同时使用,即可以用来监控数据库的健康,又可以执行一系列管理命令。如果主库发生故障,切换到备库后仍然可以继续使用数据库。

优点:

  1. 架构比较简单,使用原生半同步复制作为数据同步的依据;
  2. 双节点,没有主机宕机后的选主问题,直接切换即可;
  3. 双节点,需求资源少,部署简单;

缺点:

  1. 完全依赖于半同步复制,如果半同步复制退化为异步复制,数据一致性无法得到保证;
  2. 需要额外考虑haproxy、keepalived的高可用机制。

半同步复制机制是可靠的。如果半同步复制一直是生效的,那么便可以认为数据是一致的。但是由于网络波动等一些客观原因,导致半同步复制发生超时而切换为异步复制,那么这时便不能保证数据的一致性。所以尽可能的保证半同步复制,便可提高数据的一致性。

该方案同样使用双节点架构,但是在原有半同复制的基础上做了功能上的优化,使半同步复制的机制变得更加可靠。

半同步复制由于发生超时后,复制断开,当再次建立起复制时,同时建立两条通道,其中一条半同步复制通道从当前位置开始复制,保证从机知道当前主机执行的进度。另外一条异步复制通道开始追补从机落后的数据。当异步复制通道追赶到半同步复制的起始位置时,恢复半同步复制。

MySQL+MHA架构

MHA目前在Mysql高可用方案中应该也是比较成熟和常见的方案,它由日本人开发出来,在mysql故障切换过程中,MHA能做到快速自动切换操作,而且还能最大限度保持数据的一致性。

MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master,整个故障转移过程对应用程序完全透明。

MHA Node运行在每台MySQL服务器上,主要作用是切换时处理二进制日志,确保切换尽量少丢数据。

优点:

  1. 可以进行故障的自动检测和转移;
  2. 可扩展性较好,可以根据需要扩展MySQL的节点数量和结构;
  3. 相比于双节点的MySQL复制,三节点/多节点的MySQL发生不可用的概率更低

缺点:

  1. 至少需要三节点,相对于双节点需要更多的资源;
  2. 逻辑较为复杂,发生故障后排查问题,定位问题更加困难;
  3. 数据一致性仍然靠原生半同步复制保证,仍然存在数据不一致的风险;
  4. 可能因为网络分区发生脑裂现象;

MySQL+DRDB架构

DRBD是一种基于软件、基于网络的块复制存储解决方案,主要用于对服务器之间的磁盘、分区、逻辑卷等进行数据镜像,当用户将数据写入本地磁盘时,还会将数据发送到网络中另一台主机的磁盘上,这样的本地主机(主节点)与远程主机(备节点)的数据就可以保证实时同步。

当本地主机出现问题,远程主机上还保留着一份相同的数据,可以继续使用,保证了数据的安全。

DRBD是linux内核模块实现的快级别的同步复制技术,可以与SAN达到相同的共享存储效果。

优点:

  1. 两节点即可,部署简单,切换逻辑简单;
  2. 相比于SAN储存网络,价格低廉;
  3. 保证数据的强一致性;

缺点:

  1. 对io性能影响较大;
  2. 从库不提供读操作;

MySQL Cluster架构

MySQL Cluster 分布式集群是Mysql官方推出的集群高可用方案,通过使用NDB存储引擎实时备份冗余数据,实现数据库的高可用性和数据一致性。

优点:

  1. 全部使用官方组件,不依赖于第三方软件;
  2. 可以实现数据的强一致性;

缺点:

  1. 国内使用的较少;
  2. 配置较复杂,需要使用NDB储存引擎,与MySQL常规引擎存在一定差异;
  3. 至少三节点;

MySQL Cluster 由一组计算机构成,每台计算机上均运行着多种进程,包括 MySQL服务器,NDB Cluster的数据节点,管理服务器,以及(可能)专门的数据访问程序。

由于MySQL Cluster架构复杂,部署费时(通常需要DBA几个小时的时间才能完成搭建),而依靠 MySQL Cluster Manager 只需一个命令即可完成,但 MySQL Cluster Manager 是收费的。并且业内资深人士认为NDB 不适合大多数业务场景,而且有安全问题。因此,使用的人数较少。

MySQL+MMM架构

MMM即Master-Master Replication Manager for MySQL(mysql主主复制管理器),是关于mysql主主复制配置的监控、故障转移和管理的一套可伸缩的脚本套件(在任何时候只有一个节点可以被写入),这个套件也能基于标准的主从配置的任意数量的从服务器进行读负载均衡,所以你可以用它来在一组居于复制的服务器启动虚拟ip,除此之外,它还有实现数据备份、节点之间重新同步功能的脚本。

MySQL本身没有提供replication failover的解决方案,通过MMM方案能实现服务器的故障转移,从而实现mysql的高可用。

优点:

  1. 安全、稳定性较高,可扩展性好;
  2. 多主写入,无延迟复制,能保证数据强一致性;
  3. 同样可实现读写分离
  4. 有成熟的社区,有互联网公司在大规模的使用;
  5. 自动故障转移,自动添加、剔除节点;

缺点:

  1. 需要为原生MySQL节点打wsrep补丁
  2. 只支持innodb储存引擎
  3. 至少三节点;

但在实际应用中,会采用多种方案的整合方案。

MySQL VS Oracle

Oracle数据库是甲骨文公司推出的一款关系数据库管理系统,是当前数据库领域最有名、应用最广泛的数据库管理系统之一,Oracle产品覆盖了大、中、小型机等几十种机型。

Oracle数据库具有以下特点:

1、Oracle数据库可运行于大部分硬件平台与操作系统上。

2、Oracle能与多种通讯网络相连,支持多种网络协议。

3、Oracle的操作较为复杂,对数据库管理人员要求较高。

4、Oracle具有良好的兼容性、可移植性、可连接性和高生产率。

5、Oracle的安全性非常高,安全可靠。

MySQL也是一款关系型数据库管理系统,由MySQL AB 公司开发,目前属于 Oracle 旗下产品,MySQL 是最流行的关系型数据库管理系统之一。MySQL也是一款开源的SQL数据库管理系统,是众多小型网站作为网站数据库的选择。

MySQL数据库具有以下特点:

1、MySQL是开源的,可供用户免费使用。

2、MySQL支持多线程,充分利用CPU资源。

3、MySQL对 PHP有很好的支持,PHP是比较流行的 Web 开发语言,搭配 PHP 和 Apache 可组成良好的开发环境。

4、MySQL提供TCP/IP、ODBC和JDBC等多种数据库连接途径。

Oracle VS MySQL

1 数据安全

对于Oracle和MySQL数据库用户来说,MySQL使用一系统的授权表来管理和跟踪用户权限。当对用户进行验证、授权、访问控制时,MySQL使用这些授权表。

1.1 数据库验证

与Oracle及其他多数数据库通过用户名和密码进行验证的机制不同,MySQL使用附加的location参数对用户时行验证。这个location参数经查是主机名称、IP地址或者为一个通配字符串。通过这个附加的参数,MySQL可以限制用户访问域中的某些主机。更进一步可以做到通过不同的主机登陆时有不同的密码和用户权限。也就是说用户名相同,但登陆主机的名称不同时,可能是不同的用户。

1.2 权限

MySQL的权限系统是通过继承形成的分层结构。权限授于高层时,其他低层隐式继承被授于的权限,当然低层也可改写这些权限。

按授权范围不同,MySQL有以下种授权方式:

1、全局;

2、基于每个主机;

3、基于表;

4、基于表列。

每一级在数据库中都有一个授权表。当进行权限检查时,MySQL从高到低检查每一张表,低范围授权优先于高范围授权。

与Oracle不同,MySQL没有角色的概念。也就是说,如果对一组用户授于同样的权限,需要对每一个用户分别授权。

2 模式迁移

模式包含表、视图、索引、用户、约束、存储过程、触发器和其他数据库相关的概念。多数关系型数据库都有相似的概念。

本节包含以下内容:

1、模式对象的相似性;

2、模式对象的名称;

3、表设计时的关注点;

4、多数据库整合;

5、MySQL模式整合的关注点。

2.1 模式对象的相似性

就模式对象,Oracle和MySQL存储诸多的相似,但也有一些不同。

2.2 模式对象的名称

Oracle是大小写不敏感的,并且模式对象是以在写时行存储。在Oracle的世界中,列、索引、存储过程、触发器以及列别名都是大小写不敏感,并且在所有的平台都是如此。MySQL是大小写敏感的,如数据库相对的存储路径、表对应的文件都是如此。

当把关键字用引号引起来时,Oracle和MySQL都允许把这些关键字用于模式对象。但MySQL对于一些关键字,不加引号也行。

2.3 表设计的关注点

本节主要讨论当把MySQL转为Oracle时需要注意的地方。主要包含以下两点:

1、字符数据的类型;

2、列默认值。

2.3.1 字符数据类型

MySQL和Oracle在字符型数据保存和读取上存在一些不同。MySQL的字符类型,如CHAR和VARCHAR的长度小于65535字节。Oracle支持4种字体类型:CHAR、NCHAR、NVARCHAR2和VARCHAR2。CHAR和NCHAR的最大长度为2000字节,NVARCHAR2和VARCHAR2最大长度为4000字节。

MySQL的CHAR在按一定长度存储时,是用空格填充的右对齐方式,在读取时去掉空格。

2.3.2 列默认值

MySQL会处理列默认值,不允许他为空,这点和Oracle不同。在Oracle中如果向表插入数据,需要对有所有不允许为NULL列的值。

2.4 多数据库迁移

如果多个MySQL数据库位于同一个数据库服务上,支持迁移。

2.5 数据存储概念

MySQL的数据库对应于服务器上数据目录内的了目录,这一数据存储方式与多数据数据库不同,也包括Oracle。数据库中的表对应一个或者多个数据库目录下的文件,并取表存储时的存储引擎。

一个Oracle数据库包含一个或者多个表空间。表空间对应数据在磁盘上的物理存储。表空间是从一个或者多个数据文件开始构建的。数据文件是文件系统中的文件或者原始存储的一块空间。