1.1 定义数据库和实例
数据库:物理操作系统文件或其他形式文件类型的集合。在 MySQL 数据库中,数据库文件可以是 frm、MYD、MYI、ibd 结尾的文件。
实例:MySQL 数据库由后台线程以及一个共享内存区组成。共享内存区可以被运行的后台线程所共享。需要牢记的是,==数据库实例才是真正用于操作数据库文件的==。
一个数据库对应一个实例,但是,在集群情况下可能存在一个数据库被多个数据实例使用的情况。
通过命令 ps 观察 MySQL 数据库启动后的进程情况:ps -ef | grep mysqld
用以下命令可以查看当 MySQL 数据库实例启动时,会在哪些位置查找配置文件
➜ ~ 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
如果几个配置文件中都有同一个参数,MySQL 数据库会以读取到的最后一个配置文件的参数为准。
在没有配置文件的情况下,MySQL 会按照编译时的默认参数设置启动实例。
配置文件中有一个参数 datadir,该参数指定了数据库所在的路径。
mysql> SHOW VARIABLES LIKE 'datadir';
+---------------+------------------------+
| Variable_name | Value |
+---------------+------------------------+
| datadir | /usr/local/mysql/data/ |
+---------------+------------------------+
1 row in set (0.03 sec)
1.2 MySQL 体系结构
从概念上来说,数据库是文件的集合,是依照某种数据模型组织起来并存放于二级存储器(如磁盘)中的数据集合;数据库实例是程序,是位于用户与操作系统之间的一层数据管理软件,用户对数据库数据的任何操作,包括数据库定义、数据查询、数据维护、数据库运行控制等都是在数据库实例下进行的,应用程序通过数据库实例才能和数据库打交道。
MySQL 由以下几部分组成:
- 连接池组件
- 管理服务和工具组件
- SQL 接口组件
- 查询分析器组件
- 优化器组件
- 缓冲(Cache)组件
- 插件式存储引擎
- 物理文件
==需要特别注意的是,存储引擎是基于表的,而不是数据库。==
1.3 MySQL 存储引擎
MySQL 官方手册的第 16 章给出了编写自定义存储引擎的过程。
由于 MySQL 数据库开源特性,存储引擎可以分为 MySQL 官方存储引擎和第三方存储引擎。
1.3.1 InnoDB 存储引擎
InnoDB 存储引擎支持事务,其设计目标主要面向==在线事务处理== (OLTP) 的应用。其特点是==行锁设计、支持外键==,并支持类似于 Oracle 的非锁定读,即==默认读取操作不会产生锁==。
InnoDB 通过使用多版本并发控制 (MVCC) 来获得高并发,并且实现了 SQL 标准的 4 种隔离级别,默认为 REPEATABLE 级别。同时,使用一种被称为 next-key locking 的策略来避免幻读 (phantom) 现象的产生。
除此之外,InnoDB 存储引擎还提供了插入缓冲 (insert buffer)、二次写 (double write)、自适应哈希索引 (adaptive hash index)、预读 (read ahead) 等高性能和高可用功能。
1.3.2 MyISAM 存储引擎
MyISAM 存储引擎==不支持事务、表锁设计,支持全文索引==,主要面向一些 OLAP 数据库应用。
此外,MyISAM 存储引擎的另一个与众不同的地方是它的缓冲池==只缓存 (cache) 索引文件,而不缓冲数据文件==。
MyISAM 存储引擎表由 MYD 和 MYI 组成,MYD 用于存放数据文件,MYI 用于存放索引文件。
1.3.3 NDB 存储引擎
NDB 的特点是数据全部存放在内存中,因此主键查找 (primary key lookups) 的速度极快,并且通过添加 NDB 数据存储节点 (Data Node) 可以线性地提高数据库性能,是高可用、高性能的集群系统。
1.3.4 Memory 存储引擎
Memory 存储引擎将表中的数据存放在内存中,如果数据库重启或发生崩溃,表中的数据都将消失。
1.4 各存储引擎之间的比较
可以通过 SHOW ENGINES 语句查看当前使用的 MySQL 数据库所支持的存储引擎,也可以通过查找 information_schema 架构下的 ENGINES 表。
mysql> SHOW ENGINES;
mysql> CREATE TABLE mytest Engine=MyISAM AS SELECT * FROM inc;
可以统计使用各存储引擎后表的大小。
1.5 连接 MySQL
连接 MySQL 操作是一个连接进程和 MySQL 数据库实例进行通信,本质上是进程通信。
常用的进程通信方式有管道、命名管道、命名字、TCP/IP 套接字、UNIX 域套接字。
1.5.1 TCP/IP
TCP/IP 套接字方式是 MySQL 数据库在任何平台下都提供的连接方式,也是网络中使用得最多的一种方式。
例如:用户在 Windows 服务器下请求一台远程 Linux 服务器下的 MySQL 实例:
mysql -h192.168.0.101 -u root -p
在桐高 TCP/IP 连接到 MySQL 实例时,MySQL 数据库会先检查一张权限视图,用来判断发起请求的客户端 IP 是否允许连接到 MySQL 实例。
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 user,host from user;
+------------------+-----------+
| user | host |
+------------------+-----------+
| root | % |
| mysql.infoschema | localhost |
| mysql.session | localhost |
| mysql.sys | localhost |
+------------------+-----------+
4 rows in set (0.00 sec)
1.5.2 命名管道和共享内存
在 Windows 环境下,如果两个需要进程通信的进程在同一台服务器上,那么可以使用命名管道,Microsoft SQL Server 数据库默认安装后的本地连接也是使用命名管道。
1.5.3 UNIX 域套接字
在 Linux 和 UNIX 环境下,还可以使用 UNIX 域套接字。
用户可以在配置文件中指定套接字文件路径,如 —socket=/tmp/mysql.sock。当数据库实例启动后,用户可以通过下列命令来进行 UNIX 域套接字文件的查找。
mysql> show VARIABLES LIKE "socket";
+---------------+-----------------+
| Variable_name | Value |
+---------------+-----------------+
| socket | /tmp/mysql.sock |
+---------------+-----------------+
1 row in set (0.04 sec)
在知道了 UNIX 域套接字文件的路径后,就可以使用以下方式进行连接了:
mysql -udavid -S /tmp/mysql.sock
1.6 小结
- 区分实例与数据库的区别
- MySQL 插件式存储引擎的概念