MySQL体系结构和存储引擎

2020/3/24 17:01:35

本文主要是介绍MySQL体系结构和存储引擎,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

1.定义数据库和实例

在数据库领域中有两个词很容易混淆,这就是数据库(database)和实例(instance)。作为常见的数据库术语,这两个词定义如下:

数据库:物理操作系统文件或其他形式文件类型的集合。在MySQL数据库中,数据库的文件可以是frm,MYD,MYI,idb等结尾的文件。当使用NDB引擎时,数据库的文件可能不是操作系统上的文件,而是存放与内存之中的文件,但是定义仍然不变。

实例:MySQL数据库有后台线程以及一个共享内存区组成。共享内存可以被运行的线程所共享。需要注意的是,数据库实例才是真正用于操作数据库文件的。

2.MySQL体系结构

作为开发人员,笔者经常听到这样的疑问:

为什么MySQL不支持全文索引?

MySQ速度快是因为它支持事务吗?

数据量大于1000w时MySQL性能会急剧下降吗?

...

对于MySQL的疑问还有很多很多,笔者认为,无论对于哪种疑问,了解数据库的体系结构是最为重要的内容。上一节提出了两个概念:数据库和数据库实例。很多人会搞混淆,即MySQL是数据库,MySQL也是数据库实例。从概念上来说,数据库是文件的集合,是依照数据模型组织起来并存放在二进制存储器中的数据集合;数据库实例是程序,是位于用户操作系统之间的一层数据管理软件。

好了,再给出数据库定义后,现在来看看MySQL官方手册对于MySQL数据库体系结构的定义:

从上图中可以发现,MySQL由以下几部分组成:

连接池组件

管理服务和工具组件

SQL接口组件

查询分析器组件

优化器组件

缓冲组件

插件式存储引擎

物理文件

很多时候,开发人员经常会对使用到的不同数据库做对比,对于MySQL而言,区别于其他数据可的最重要的一个特点就是其插件式的表存储引擎。需要注意的是,存储引擎是基于表的,而不是基于数据库。

3.MySQL存储引擎

3.1 InnoDB存储引擎

InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计,支持外键,并支持类似于Oracle的非锁定读,即默认读取操作不会产生锁。从MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。

InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了MySQL标准的4种隔离级别,默认为REPEATABLE级别。除此之外,InnoDB存储引擎还提供了插入缓冲,二次写,自适应哈希索引,预读等高性能和高可用的功能

对于表中数据的存储,InnoDB采用了聚集的方式,因此每张表的存储都是按照逐渐的顺序进行存放。如果没有显示的在表定义是指定主键,InnoDB存储引擎会为每一行生成一个6个字节的ROWID,并以此为主键。

InnoDB存储引擎是MySQL数据库最为常用的一种引擎,而FaceBook,Google,Yahoo!等公司的成功应用已经证明了InnoDB存储引擎具备的高可用性,高性能以及高扩展性

3.2 MyISAM存储引擎

MyISAM存储引擎不支持事务,表锁设计,支持全文索引,主要面向一些OLAP数据库应用。在MySQL 5.5.8版本以前MyISAM一直是MySQL数据库的默认存储引擎。MyISAM存储引擎的另一个与众不同的地方是它的缓冲池只缓存索引文件,而不是缓冲数据文件,这点和绝大多数的数据库非常不同。

MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。在MySQL5.0版本以前,MyISAM默认的大小为4GB,如果需要支持大于4GB的MyISAM表时,则需要指定MAX_ROWS和AVG_ROW_LENGTH属性。

3.3 NDB存储引擎

NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC集群,不过与Oracle RAC share everything架构不同的是,其结构是share nothing的集群架构,因此能提供更高的可用性。

3.4 Mermory存储引擎

Mermory存储引擎将表中的数据放在内存之中,如果数据库重启或发生崩溃,表中的数据都将消失。它非常适合用于存储临时数据的临时表,以及数据仓库中的维度表。Memory存储引擎默认使用Hash索引,而不是我们收悉的B+树索引。

虽然Memory存储引擎速度非常快,但在使用上还是有一定的限制。比如,只支持表锁,并发性能较差,并且不支持TEXT和BLOB列类型。

3.5 Archive存储引擎

Archive存储引擎只支持INSERT和SELECT操作,从MySQL5.1以后开始支持索引。Archive存储引擎使用zlib算法将数据行(ROW)进行压缩后存储,压缩比一般可达1:10.

3.6 Federated存储引擎

Federated存储引擎表并不存放数据,它只是指向一台远程MySQL数据库服务器上的表。这非常类似于SQL Server的链接服务器和Oracle的透明网关,当前的Federated存储引擎只支持MySQL数据库表,不支持异构数据库表。

3.7 其他数据库存储引擎

除了以上6中常见MySQL数据库存储引擎,包括Merge,CSV,Sphinx和Infobright.了解完MySQL的存储引擎以后,可以回答上面的疑问了。

为什么MySQL数据库不支持全文索引?

不!MySQL支持,MyISAM和InnoDB存储引擎都支持全文索引。

MySQL数据库速度快是因为不支持事务吗?

错!虽然MySQL的MyISAM存储引擎不支持事务,但是InnoDB支持。“快”是相对与不同应用来说的,对于ETL这中操作,MyISAM会有优势,但在OLTP(面向在线事务处理)环境中,InnoDB存储引擎的效率更好!

当表的数据量大于1000w时MySQL的性能会急剧下降吗?

不!MySQL是数据库,不是文件,随着数据行的增加,性能当然会有所下降,但是这些下降不是线性的,如果用户选择了正确的存储引擎,以及正确的配置,再多的数据量MySQL也能承受。

4.各种存储引擎之间的比较

  • 存储引擎 MyISAM InnoDB MEMORY Archive
  • 存储容量限制 N 64TB N N
  • 事务支持 N Y N N
  • 锁的粒度 Table Row Table Row
  • MVCC(多版本并发控制)支持 Y

5.连接MySQL

连接MySQL操作是一个连接进程和MySQL数据库实例进行通信。从设计角度来说,本质上进程通信。如果对进程通信比较了解,可以知道通用的进程通信方式有管道,命名管道,命名字,TCP/IP套接字,UNIX域套接字。

5.1 TCP/IP

TCP/IP 套接字方式是MySQL数据库在任何平台下都提供的连接方式,也是网络中使用最多的一种方式。这种方式在TCP/IP连接上建立一个基于网络的连接请求,一把请款修改客户端在一台服务器上,而MySQL实例在另一台服务器上,这两台机器通过一个TCP/IP网络连接。

5.2 命名管道和共享内存

在Windows 2000,Windows XP,Windows 2003以及在此之上的平台上,如果两个需要进程通信的进程在同一台服务器上,那么可以使用命名管道,Microsoft SQL Server数据库默认安装后的本地连接也是使用命名管道。

5.3 UNIX域套接字

在Linux和UNIX环境下,还可以使用UNIX域套接字。UNIX套接字其实不是一个网络协议,所以只能在MySQL客户端和数据库实例在同一台服务器上的请款修改使用。



这篇关于MySQL体系结构和存储引擎的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程