最初在使用 MySQL 数据库时,仅仅停留在增删改查的层次。缺乏对于数据库整体的认知。随着工作中接触到的需求越来越复杂,渐渐的认识到需要再次深入的去学习一下 MySQL。最近这几个月看了一些数据库相关的书籍,整理出了下面一些知识点。
数据库范式
数据库范式是为解决关系数据库中数据冗余、更新异常、插入异常、删除异常问题而引入的。简单的理解,数据库范式可以避免数据冗余,减少数据库的空间,并且减轻维护数据完整性的麻烦。
- 第一范式,强调属性的原子性约束,要求属性具有原子性,不可再分解。
- 第二范式,强调记录的唯一性约束,表必须有一个主键,并且没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的一部分。
- 第三范式,强调属性冗余性的约束,即非主键列必须直接依赖于主键。
数据库的定义
在数据库体系中,数据库 与 实例 是两个不同的概念。很多开发人员对两者的区别不是很清楚。
- 数据库:物理操作系统文件或其他形式文件类型的集合
- 实例:MySQL 数据库后台线程以及一个共享的内存区域
一般来说,一个数据库会对应一个实例。但是在集群 RAC 共享数据文件时,一个数据库会对应多个实例。数据库是由一个个数据文件组成的,当我们需要进行 CRUD 等操作时,是不能通过粗暴的文件修改来完成的,需要通过数据库实例来完成对数据库的操作。
1 2 3 4 5 6 7 8
| # 查看数据文件 $ ls -al /usr/local/var/mysql drwxr-xr-x 39 vincent admin 1248 12 21 12:24 . drwxrwxr-x 7 vincent admin 224 6 17 2019 .. drwxr-x--- 19 vincent admin 608 9 29 17:29 classicmodels drwxr-x--- 77 vincent admin 2464 6 17 2019 mysql drwxr-x--- 108 vincent admin 3456 6 17 2019 sys drwxr-x--- 5 vincent admin 160 12 20 18:32 test
|
1 2 3 4
| # 查看数据库实例 $ ps -ef | grep mysqld 501 374 1 0 12:24下午 ?? 0:00.03 /bin/sh /usr/local/opt/mysql@5.7/bin/mysqld_safe --datadir=/usr/local/var/mysql 501 474 374 0 12:24下午 ?? 0:05.73 /usr/local/opt/mysql@5.7/bin/mysqld --basedir=/usr/local/opt/mysql@5.7 --datadir=/usr/local/var/mysql --plugin-dir=/usr/local/opt/mysql@5.7/lib/plugin --log-error=vincentdeMacBook-Pro.local.err --pid-file=vincentdeMacBook-Pro.local.pid
|
插件式存储引擎
MySQL 数据库区别与其他数据库的一个重要特点就是它的插件式表 存储引擎。存储引擎是基于表的,而不是数据库。这就意味着,可以在同一数据库的不同表中设置不同的存储引擎。这样做的好处是,每个存储引擎都有各自不同的特点,开发人员可以根据不同的业务逻辑建立不同的存储引擎表。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| # 查看当前数据库对存储引擎的支持情况 mysql> show engines; +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | MyISAM | YES | MyISAM storage engine | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | +--------------------+---------+----------------------------------------------------------------+--------------+------+------------+ 9 rows in set (0.01 sec)
|
在 MySQL 5.5.8 版本之前,默认的存储引擎是 MyISAM,MyISAM 存储引擎不支持事务,表锁设计,支持全文索引。
在 MySQL 5.5.8 版本之后,默认的存储引擎是 InnoDB,InnoDB 支持事务,行锁设计。两种存储引擎的区别在后续的文章会详细介绍。
文件系统
MySQL 的文件大致可以分为这几类:参数文件 日志文件 Socket 文件 PID 文件 表结构文件 数据文件。
参数文件 会在 MySQL 启动时被加载读取。文件中会定义数据文件的位置、各种内存大小的设置等。
日志文件 记录了 MySQL 运行时的一些状态。有错误日志、慢查询日志、二进制日志等。
套接字文件 当用 UNIX 套接字方式进行连接时锁需要的文件。
PID 文件 MySQL 实例进程 ID 文件
表结构文件 用来存放 MySQL 表结构定义的文件
数据文件 存储记录和索引数据。因为 MySQL 插件式存储引擎的原因,每个存储引擎都有自己的文件系统来存储记录和索引数据。所以每个存储引擎记录的数据文件格式并不一样。
启动与连接
MySQL 有四种启动方式,分别是 mysqld mysqld_safe mysql.server mysqld_multi。
mysqld 是最常见的启动方式,启动后仅有一个 mysqld 进程。
mysqld_safe 通过调用 mysqld 的方式启动实例,启动后会有两个进程,分别是 mysqld mysqld_safe 当实例出现错误时会自动重启。
mysql.server 通过调用 mysqld_safe 的方式来启动实例
mysqld_multi 多实例启动工具,用来管理多个 mysqld 进程,可以配置不同的实例参数
结构化查询语言
结构化查询语言,也就是我们通常所说的 SQL 语句。SQL 语句主要分为以下三个类别:
- DDL(Data Definition Languages) 数据定义语句,用于定义数据库、表、字段、索引、视图、触发器等。常用关键字为
CREATE DROP ALTER 等。
- DML(Data Manipulation Languages) 数据操纵语句,用于增删改查数据库记录,常用关键字为
INSERT UPDATE SELECT DELETE 等。
- DCL(Data Control Languages) 数据控制语句,用于控制用户对数据库、表、字段的访问权限和安全级别。常用关键字为
GRANT REVOKE 等。
参考连接