在数据库领域中有两个词很容易混淆,这就是数据库(database)和实例(instance)。作为常见的数据库术语,这两个词定义如下:
数据库:物理操作系统文件或其他形式文件类型的集合。在MySQL数据库中,数据库的文件可以是frm,MYD,MYI,idb等结尾的文件。当使用NDB引擎时,数据库的文件可能不是操作系统上的文件,而是存放与内存之中的文件,但是定义仍然不变。
实例:MySQL数据库有后台线程以及一个共享内存区组成。共享内存可以被运行的线程所共享。需要注意的是,数据库实例才是真正用于操作数据库文件的。
作为开发人员,笔者经常听到这样的疑问:
为什么MySQL不支持全文索引?
MySQ速度快是因为它支持事务吗?
数据量大于1000w时MySQL性能会急剧下降吗?
...
对于MySQL的疑问还有很多很多,笔者认为,无论对于哪种疑问,了解数据库的体系结构是最为重要的内容。上一节提出了两个概念:数据库和数据库实例。很多人会搞混淆,即MySQL是数据库,MySQL也是数据库实例。从概念上来说,数据库是文件的集合,是依照数据模型组织起来并存放在二进制存储器中的数据集合;数据库实例是程序,是位于用户操作系统之间的一层数据管理软件。
好了,再给出数据库定义后,现在来看看MySQL官方手册对于MySQL数据库体系结构的定义:
从上图中可以发现,MySQL由以下几部分组成:连接池组件
管理服务和工具组件
SQL接口组件
查询分析器组件
优化器组件
缓冲组件
插件式存储引擎
物理文件
很多时候,开发人员经常会对使用到的不同数据库做对比,对于MySQL而言,区别于其他数据可的最重要的一个特点就是其插件式的表存储引擎。需要注意的是,存储引擎是基于表的,而不是基于数据库。
InnoDB存储引擎支持事务,其设计目标主要面向在线事务处理(OLTP)的应用。其特点是行锁设计,支持外键,并支持类似于Oracle的非锁定读,即默认读取操作不会产生锁。从MySQL数据库5.5.8版本开始,InnoDB存储引擎是默认的存储引擎。
InnoDB通过使用多版本并发控制(MVCC)来获得高并发性,并且实现了MySQL标准的4种隔离级别,默认为REPEATABLE级别。除此之外,InnoDB存储引擎还提供了插入缓冲,二次写,自适应哈希索引,预读等高性能和高可用的功能。
对于表中数据的存储,InnoDB采用了聚集的方式,因此每张表的存储都是按照逐渐的顺序进行存放。如果没有显示的在表定义是指定主键,InnoDB存储引擎会为每一行生成一个6个字节的ROWID,并以此为主键。
InnoDB存储引擎是MySQL数据库最为常用的一种引擎,而FaceBook,Google,Yahoo!等公司的成功应用已经证明了InnoDB存储引擎具备的高可用性,高性能以及高扩展性
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属性。
NDB存储引擎是一个集群存储引擎,类似于Oracle的RAC集群,不过与Oracle RAC share everything架构不同的是,其结构是share nothing的集群架构,因此能提供更高的可用性。
Mermory存储引擎将表中的数据放在内存之中,如果数据库重启或发生崩溃,表中的数据都将消失。它非常适合用于存储临时数据的临时表,以及数据仓库中的维度表。Memory存储引擎默认使用Hash索引,而不是我们收悉的B+树索引。
虽然Memory存储引擎速度非常快,但在使用上还是有一定的限制。比如,只支持表锁,并发性能较差,并且不支持TEXT和BLOB列类型。
Archive存储引擎只支持INSERT和SELECT操作,从MySQL5.1以后开始支持索引。Archive存储引擎使用zlib算法将数据行(ROW)进行压缩后存储,压缩比一般可达1:10.
Federated存储引擎表并不存放数据,它只是指向一台远程MySQL数据库服务器上的表。这非常类似于SQL Server的链接服务器和Oracle的透明网关,当前的Federated存储引擎只支持MySQL数据库表,不支持异构数据库表。
除了以上6中常见MySQL数据库存储引擎,包括Merge,CSV,Sphinx和Infobright.了解完MySQL的存储引擎以后,可以回答上面的疑问了。
为什么MySQL数据库不支持全文索引?
不!MySQL支持,MyISAM和InnoDB存储引擎都支持全文索引。
MySQL数据库速度快是因为不支持事务吗?
错!虽然MySQL的MyISAM存储引擎不支持事务,但是InnoDB支持。“快”是相对与不同应用来说的,对于ETL这中操作,MyISAM会有优势,但在OLTP(面向在线事务处理)环境中,InnoDB存储引擎的效率更好!
当表的数据量大于1000w时MySQL的性能会急剧下降吗?
不!MySQL是数据库,不是文件,随着数据行的增加,性能当然会有所下降,但是这些下降不是线性的,如果用户选择了正确的存储引擎,以及正确的配置,再多的数据量MySQL也能承受。
连接MySQL操作是一个连接进程和MySQL数据库实例进行通信。从设计角度来说,本质上进程通信。如果对进程通信比较了解,可以知道通用的进程通信方式有管道,命名管道,命名字,TCP/IP套接字,UNIX域套接字。
TCP/IP 套接字方式是MySQL数据库在任何平台下都提供的连接方式,也是网络中使用最多的一种方式。这种方式在TCP/IP连接上建立一个基于网络的连接请求,一把请款修改客户端在一台服务器上,而MySQL实例在另一台服务器上,这两台机器通过一个TCP/IP网络连接。
在Windows 2000,Windows XP,Windows 2003以及在此之上的平台上,如果两个需要进程通信的进程在同一台服务器上,那么可以使用命名管道,Microsoft SQL Server数据库默认安装后的本地连接也是使用命名管道。
在Linux和UNIX环境下,还可以使用UNIX域套接字。UNIX套接字其实不是一个网络协议,所以只能在MySQL客户端和数据库实例在同一台服务器上的请款修改使用。