MySQL:单进程多线程数据库。
为后续可以清楚的理解MySQL体系结构中的存储引擎,这里先介绍清楚数据库和数据库实例这两个概念
简单来说,数据库是由一个个文件组成(一般都是二进制文件),如果要对这些文件执行诸如SELECT、INSERT、UPDATE和DELETE之类的操作,不能通过简单的操作文件来更改数据库的内容,而是需要通过数据库实例来完成对数据库的操作。
数据库实例和数据库,通常是一一对应关系,但在集群情况下,一个数据库可被多个实例使用。
启动实例时,MySQL数据库会去读取配置文件,若没有配置文件,则会按照编译时的默认参数设置启动实例(而在Oracle中,如果没有配置文件,启动时会提示找不到参数文件),可以通过命令查看MySQL实例启动时,会去哪些位置查找配置文件(在MySQL安装目录的bin目录下执行):
[root@mysql bin]# ./mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/local/mysql/etc/my.cnf ~/.my.cnf
各配置文件从前往后按顺序读取,若多个配置文件中有同一个参数,会以读取到的最后一个配置文件中的参数为准(即覆盖之前的配置)
datadir参数:指定数据库所在路径。可以通过下面的命令查看数据库所在路径:
mysql> show variables like 'datadir'\G;
*************************** 1. row ***************************
Variable_name: datadir
Value: /usr/local/mysql/mysql-5.6.40-linux-glibc2.12-x86_64/data/
1 row in set (0.00 sec)
了解了一些概念,下面介绍一下MySQL数据库的体系结构:(图片来自《MySQL技术内幕:InnoDB存储引擎》)
MySQL由以下几部分组成:
注:插件式体系结构是MySQL独有的,并且存储引擎是MySQL区别于其他数据库的一个最重要特性。存储引擎是基于表的,而不是数据库。
存储引擎的好处:每个存储引擎有各自的特点,可根据不同的应用建立不同的存储引擎表。
InnoDB存储引擎:Windows版本下的默认存储引擎,支持事务,主要面向在线事务处理(OLTP)方面的应用。
支持行锁设计、外键以及类似于Oracle的非锁定读,即默认情况下读取操作不会产生锁。
InnoDB存储引擎将数据放在一个逻辑的表空间中,由InnoDB自身进行管理(类似于黑盒)。
对于表中数据的存储,InnoDB存储引擎采用了聚集的方式(类似于Oracle的索引聚集表),按主键顺序存放,如未指定主键,则为每行生成一个6字节的ROWID,并以此作为主键。
MyISAM存储引擎:除Windows版本外,所有MySQL版本默认的存储引擎。不支持事务、表锁和全文索引。OLAP(在线分析处理)速度快。
MyISAM存储引擎由MYD(存放数据文件)和MYI(存放索引文件)组成。
NDB存储引擎:集群存储引擎(类似于Oracle的RAC集群), share nothing的集群结构,数据全部放在内存中(5.1版本后,非索引数据放在磁盘上),主键查找速度极快,通过添加NDB数据存储节点,可以线性的提高数据库性能。
注:NDB存储引擎的连接操作(JOIN)是在MySQL数据库层完成的,而不是在存储引擎层,即复杂的连接操作需要巨大的网络开销,查询速度很慢。
Memory存储引擎:即HEAP存储引擎,将表中的数据放在内存中,适用于存储临时数据的临时表和数据仓库中的纬度表。默认使用哈希索引,而不是B+树索引。
只支持表锁,并发性能差,不支持TEXT和BLOB列类型,存储varchar时是按照char的方式。
注:MySQL数据库使用Memory存储引擎作为临时表来存放查询的中间结果集。如果中间结果集大于Memory存储引擎表的容量设置,或者中间结果含有TEXT或BLOB,则会将其转换到MyISAM存储引擎表而放到磁盘(5.1版本后非索引数据放在磁盘),这时产生的临时表性能对于查询会有损失。
Archieve存储引擎:只支持INSERT和SELECT操作,5.1版本开始支持索引。使用zlib算法将数据行进行压缩后存储(压缩比例一般可达1:10),适用于存储归档数据,如日志信息。使用行锁来实现高并发的插入操作,本身非事务安全,设计目标为提供高速的插入和压缩功能。
Federated存储引擎:不存放数据,只是指向远程MySQL数据库服务器上的表(类似于SQL Server的链接服务器和Oracle的透明网关),只支持MySQL数据库表。
Maria存储引擎:为取代原有的MyISAM存储引擎而设计,特点是:缓存数据和索引文件,行锁设计,提供MVCC功能,支持事务和非事务安全的选项支持,以及更好的BLOB字符类型的处理性能。
可通过SHOW ENGINES查看当前使用的MySQL数据库支持的存储引擎,也可以通过information_schema架构下的ENGINES表查看:
mysql> show engines\G;
*************************** 1. row ***************************
Engine: InnoDB
Support: DEFAULT
Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
XA: YES
Savepoints: YES
*************************** 2. row ***************************
Engine: CSV
Support: YES
Comment: CSV storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 3. row ***************************
Engine: MRG_MYISAM
Support: YES
Comment: Collection of identical MyISAM tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 4. row ***************************
Engine: BLACKHOLE
Support: YES
Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
XA: NO
Savepoints: NO
*************************** 5. row ***************************
Engine: MyISAM
Support: YES
Comment: MyISAM storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 6. row ***************************
Engine: MEMORY
Support: YES
Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
XA: NO
Savepoints: NO
*************************** 7. row ***************************
Engine: ARCHIVE
Support: YES
Comment: Archive storage engine
Transactions: NO
XA: NO
Savepoints: NO
*************************** 8. row ***************************
Engine: FEDERATED
Support: NO
Comment: Federated MySQL storage engine
Transactions: NULL
XA: NULL
Savepoints: NULL
*************************** 9. row ***************************
Engine: PERFORMANCE_SCHEMA
Support: YES
Comment: Performance Schema
Transactions: NO
XA: NO
Savepoints: NO
9 rows in set (0.00 sec)
MySQL提供实例数据库,但在安装数据库时未提示用户是否安装,因此需自己下载,用MySQL的实例数据库做一个简单例子可显示各存储引擎之间的区别:
连接MySQL操作是连接进程和MySQL数据库实例进行通信,实质上是进程通信,进程通信常用方式有管道、命名管道、命名字、TCP/IP套接字、Unix域名套接字。
TCP/IP:如下图:
通过TCP/IP连接到MySQL实例时,MySQL会先检查一张权限视图,用来判断客户端IP是否允许连接到MySQL实例。该视图在mysql库下,表名为user:
mysql> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
mysql> select host, user, password from user;
+-------------------+------+-------------------------------------------+
| host | user | password |
+-------------------+------+-------------------------------------------+
| localhost | root | *D5C139BE655F9C459762CC5D8C6819988C732B94 |
| host-mysql | root | |
| 127.0.0.1 | root | |
| ::1 | root | |
| localhost | | |
| host-mysql | | |
| % | root | *D5C139BE655F9C459762CC5D8C6819988C732B94 |
+-------------------+------+-------------------------------------------+
7 rows in set (0.00 sec)
命名管道和共享内存:
如果需要通信的两个进程在同一台服务器上,可以使用命名管道。MySQL4.1之后,MySQL还提供了共享内存的连接方式,在配置文件中添加--shared-memory。
Unix域套接字:
Unix域套接字并非一个网络协议,因此只能在客户端和数据库实例在同一台服务器上时使用,并且只能在Linux和Unix环境下使用。可在配置文件中指定套接字文件的路径,如-socket=/tmp/mysql.sock。
查找Unix域套接字文件:
mysql> show variables like 'socket';
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| socket | /tmp/mysql.sock |
+---------------+-----------------+
1 row in set (0.00 sec)
知道Unix域套接字文件路径后,可通过如下方式连接:
[root@mysql bin]# ./mysql -uroot -S /tmp/mysql.sock -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 22
Server version: 5.6.40 MySQL Community Server (GPL)
Copyright (c) 2000, 2018, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
首先介绍了数据库和数据库实例的含义,然后分析了MySQL的体系结构,还详细讲解了各种常见的存储引擎的特性、适用情况以及彼此之间的区别。
内容来自《MySQL技术内幕:InnoDB存储引擎》