数据库和存储引擎
MySQL中,数据库(也叫模式,Schema)指的是一种逻辑容器,用于存储表格、视图、索引、存储过程等数据库对象,它是关系型数据库管理系统(RDBMS)中的基本管理单位。每个数据库包含多个数据表(Table),每个表包含多行数据记录,这些数据通过列(字段)组织在一起。而存储引擎则是数据库中用于创建和管理表的底层架构,存储引擎决定了数据如何存储在磁盘上以及如何处理读写请求。这篇笔记我们对MySQL的数据库和存储引擎进行介绍。
基本概念
学习如何管理数据库之前,我们必须先分清几个基本概念。
数据库管理系统(DBMS):数据库管理系统是一种用于存储数据的软件系统,MySQL软件属于关系型数据库管理系统(RDBMS)。
数据库服务器:指MySQL的mysql-server
部分,它以服务的形式运行在服务器操作系统上,其他程序可以通过各种客户端访问mysql-server
。
客户端:指mysql-client
、phpMyAdmin、Navicat等能够访问和管理MySQL的客户端软件程序。
数据库(也叫模式,Schema):这里所说的“数据库”是一个抽象的概念,它是MySQL软件中数据的基本管理单位。
数据表(Table):数据表通过记录和列组织数据,一个数据库通常包含多个数据表,表是关系数据库理论的基础。
MySQL基本数据库管理命令
下面我们使用命令行工具完成MySQL数据库的一些基本管理操作。
查看已有的数据库
show databases;
创建一个数据库
create database netstore;
这条命令创建了一个最基本数据库,我们可以在里面创建数据表,我们的应用可以连接上去进行SQL语句操作。
在MySQL命令行中,我们可以使用use <dbname>
命令选择一个数据库。
删除一个数据库
drop database netstore;
该命令会删除指定数据库中的一切数据,使用时请务必小心,以免引起不必要的麻烦,服务器上删除数据库是很罕见的操作。不过在开发环境中调试程序时,有时为了方便会直接删除一个数据库再重建。
MySQL的服务端架构
MySQL的服务端架构如下图所示。
其中,Connectors为客户端部分,我们可以通过各种客户端软件访问MySQL服务器,或者通过代码调用驱动包操作数据库。Management Services & Utilities则是周边的管理和控制工具,这两部分外围模块很容易理解。而服务端的核心部分大致分为以下三层:
连接管理层:Connection Pool层负责管理用户连接,它负责处理对于MySQL服务端的网络请求,维护连接池,对请求进行认证和鉴权等。
查询服务层:SQL Interface部分接受SQL语句调用底层组件并返回结果,Parsers负责对SQL进行解析和语法分析生成查询计划树,Optimizer即查询优化器,它会分析查询的不同执行计划并选择一个最优的执行路径,Caches & Buffers实现了读写的缓存机制。
存储引擎层:存储引擎负责具体处理数据在文件系统上的存取,实际执行对数据的增、删、改、查操作。每个存储引擎都是独立的,MySQL提供多种存储引擎,用户可以根据需求选择不同的存储引擎实现自己的业务逻辑。
存储引擎
MySQL提供了多种存储引擎,不同数据表可以使用不同存储引擎,各种不同实现有其自身的优势和缺点,我们应该取长补短合理使用。这里我们介绍几种常用的存储引擎,有关存储引擎底层的知识,请参考数据库基础理论相关章节。
执行以下命令查看可用的存储引擎。
show engines;
上图是MySQL8的返回结果。
InnoDB
InnoDB是默认的存储引擎,它功能丰富而且性能不弱,是泛用性最强而且使用最多的存储引擎。InnoDB具有以下特性:
- 支持事务安全表(ACID),行锁定和外键。MySQL中,InnoDB表可以和使用其他存储引擎的表联合查询(但是外键约束无论如何不能跨引擎使用)。
- InnoDB将所有的表和索引维持在一个逻辑表空间中,表空间可能包含数个文件。InnoDB表可以是任意尺寸的,即使在文件尺寸被限制在2GB的操作系统上。
- InnoDB不创建目录,而是在MySQL数据目录下创建一个名为
ibdata1
的自动扩展数据文件,该文件通常存储在/var/lib/mysql/ibdata
下。
MyISAM
MyISAM在Web、数据仓库等应用场景下使用,这个引擎有较高的插入和查询速度,但不支持事务。
Memory
Memory引擎将表中的数据存储到内存中,通常用于临时存储数据,为查询和引用其他表数据提供快速访问。Memory不支持BLOB和TEXT数据类型,但它有强大的索引功能。有关Memory引擎具体请参考MySQL相关的文档,这里就不多做介绍了。
注意:使用Memory表时,如果MySQL服务重启,里面的数据会全部丢失。
存储引擎的选择
执行以下命令可以更换数据表的存储引擎。
alter table <表名> engine=<更改后的存储引擎名>;
- InnoDB 默认的存储引擎,具有最好的泛用性(如果你还在纠结用什么存储引擎比较好,现在不需要考虑了,我们还是用默认的InnoDB吧)
- MyISAM 数据表主要用来插入和查询记录,使用MyISAM性能较好
- Memory 临时存放数据且数据量不大并且不需要较高的数据安全性,使用Memory性能较好
总而言之,MyISAM适合作数据仓库,单线程插入和查询速度比InnoDB快数倍;Memory最快但有容量限制,只能存储很少的数据,可以作为临时性的缓存表或数据仓库计算步骤的中间表,较少使用;InnoDB适合有一定并发量的普通业务数据库等大多数情况。