MySQ
L 数据库由后台线程以及一个共享内存区组成。数据库实例才是真正用于操作数据库文件的。 MySQL
数据库实例在系统上的表现就是一个进程。
数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合;数据库实例是程序,是位于用户于操作系统之间的一层数据管理软件,用户对数据库数据的任何操作,包括数据库定义、数据查询、数据维护、数据库运行控制等都是在数据库实例下进行的,应用程序只有通过数据库实例才能和数据库打交道。
MySQL
数据库的体系如下所示:
MySQL
由以下几部分组成:
SQL
接口组件Cache
)组件 MySQL
数据库区别于其他数据库的最重要的一个特点就是其插件式的存储引擎。存储引擎式基于表的,而不是数据库。
存储引擎的好处是,每个存储引擎都有各自的特点,能够根据具体的应用建立不同存储引擎表。
InnoDB
是默认的事务性引擎,被用来设计处理大量的短期事务。其特点是支持行锁、外键、非锁定读,即默认读取操作不会产生锁。
InnoDB
通过使用多版本控制(MVCC
)来获得高并发性,并且实现了SQL
标准的四种隔离级别,默认是REPEATABLE
级别。同时使用next-key
避免欢度(phantom)现象的产生。
InnoDB
还提供了插入缓冲、二次写、自适应哈希索引、预读等高性能、高可用的功能。
InnoDB
采用聚集的方式存储表中的数据,因此每张表的存储都是按主键的顺序进行存放。
MyISAM
不支持事务、行锁、外键等,支持表锁、全文索引等。
MyISAM
另一个特点是其缓冲池只缓存(cache
)文件,而不缓存数据文件。
MyISAM
表由MYD
和MyI
组成,MYD
用来存放数据文件,MYI
用来存放索引文件。
NDB
是一个集群存储引擎。
NDB
的特点是数据全部存放在内存中(5.1 版本,可以将非索引数据放在磁盘上),因此主键查询的速度极快,通过添加NDB
数据存储引擎节点(Data Node
)可以线性地提高数据库性能,是高可用、高性能地集群系统。
Memory
将表中的数据存放在内存中,,如果数据库重启或宕机,表中的数据将消失,适合用于存储临时数据的临时表。
Memory
默认使用哈希索引。
Archive
只支持INSERT
和SELECT
操作,其设计的主要目标是提供高速的插入和压缩功能。
Archive
非常适合存储归档数据,如日志信息。
Federated
并不存放数据,用来访问其他MySQL
数据库服务器的代理。
Maria
设计目的是用来取代MyISAM
。
Maria
特点是:支持缓存数据和索引文件,应用了行锁设计,提供了MVCC
功能,支持事务和非事务安全的选项,以及更好的BLOB
字符类型的处理性能。
BlackHole
只记录日志信息,其没有实现任何存储机制,它会丢弃所有插入的数据,不做任何保存。但服务器会记录Blackhole表的日志,所以可以用于复制数据到备库,或者简单的日志记录。
CSV
可以将普通的CSV
文件作为MySQL
的表来处理,但不支持索引。
CSV
存储的数据直接可以在操作系统里,用文本编辑器或Excel
读取。
InnoDB
和MyISAM
是最常用的存储引擎,两者的对比如下:
连接MySQL
指一个连接进程和MySQL
数据库实例进行通信。本质上是进程之间如何进行通信,常用的方式有匿名管道、命名管道、命名字、TCP/IP
套接字、UNIX
域套接字。
TCP/IP
方式是MySQL
数据库在任何平台下都提供的连接方式,这种方式在TCP/IP
连接上建立一个基于网络的连接请求,一般情况下客户端(client
)在一台服务器,而MySQL
实例(server
)在另一台服务器上,这两台机器通过一个TCP/IP
网络连接。
管道的本质便是文件,进程间通过对文件内容的读写实现通信。
匿名管道用于有亲缘关系的进程通信。
命名管道用于无亲缘关系的进程通信。
本质同管道,进程间通过对内存区域中的数据读写完成通信。
在Linux
和Unix
环境下,还可以使用UNIX
域套接字,只能在MySQL
客户端和数据库实例都在一台服务器上的情况下使用。