MySQL Essentials: A Primer on Database Design, Manageme
发布时间
阅读量:
阅读量
作者:禅与计算机程序设计艺术
1.简介
2020年标志着MySQL数据库时代的开启,在这一 year里其最新版本更新至MySQL 8.0。作为IT行业中不可或缺的技术领域,
数据库技术不仅能够高效地管理海量数据并存储大量信息,
还能够实现一系列复杂的业务需求。
对于许多初级及中高级数据库管理员而言,
掌握数据库系统的规划与管理、性能优化以及安全防护等方面的专业知识至关重要。
本书是基于作者多年从事数据库开发工作、实践经验编写的一本入门级数据库书籍。本书从数据库的一些基本概念和术语出发,介绍了数据库的设计理论和原则,阐述了数据库的结构设计、表的创建、插入数据、更新数据、查询数据等常用功能,并对数据库进行了详细的性能调优、安全防护等指导。最后通过对一些实际案例的剖析,说明了如何将数据库应用于企业级应用场景,提升用户体验,提升网站及应用的整体性能。
本书适用于具有相关专业背景的各类数据库管理人员,包括DBA、数据库工程师、技术总监等。具备良好的英文读写能力和计算机相关基础知识,能够更好地理解和运用数据库技术。
作者:<NAME>
Email: <EMAIL>
QQ/微信号: brian19971116
Github地址:https://github.com/Brian-M-code
欢迎关注Brian在Github上的开源项目及文章,欢迎纠错、提供建议。
## 2.基本概念与术语
### 2.1数据库(Database)
数据库(Database)是建立在关系模型基础上的信息化结构,是用来组织、存储、管理、保护和查询数字化的信息的仓库。它由若干个文件或表格组成,每张表格记录了不同的类型的数据,每个字段对应着一种数据类型,整个数据库由一个或多个不同的用户共享。
#### 2.1.1数据库分类
根据数据库的存取方式,数据库可以分为如下三种类型:
- 层次型数据库(Hierarchical database):主要是依据树状结构组织数据的数据库。例如,一棵树表示组织机构,其中的节点代表部门,每一个节点的子节点代表该部门下的成员。
- 网络型数据库(Networked database):将不同计算机上的数据库连接起来形成的一个大型的共享数据库系统。例如,互联网就是一种典型的网络型数据库。
- 关系型数据库(Relational database):采用关系模型来存储和管理数据的数据库。关系模型是一种建立在集合论上的数据模型,每个关系型数据库都由一系列的表格(Table)组成,每一张表格都有固定数量的列(Column),并且每一张表格都有若干条记录(Row)。
### 2.2关系模型
关系模型是一种数据模型,关系模型将真实世界中实体之间的联系抽象成一张二维表格,其中每个单元格称为元组(Tuple),每个字段称为属性(Attribute),而实体之间关系也被抽象成链接两个元组的线索(Link)。
上图是一个关系模型的示意图,左边表示实体集,右边表示关系。实体集可以看作一张表格,表头表示属性名,列表示元组。关系是两个实体集之间存在的联系,可以用箭头表示。
#### 2.2.1关系数据模型的约束条件
在关系模型里,任意两张表之间都可能存在依赖关系,也就是表与表之间的关联关系。这些依赖关系共同决定了关系模型的结构和逻辑特性。例如,实体集A、B、C之间的联系可以用两种方式建模:
- 一对一关系:实体集A只能与实体集B存在一对一关系,即A中只有一条元组与B中一条元组对应。这种关系不允许存在两条元组对应同一实体集,因此无法处理多对一、一对多、多对多等关系。
- 一对多关系:实体集A可与实体集B存在一对多关系,即A中的每一条元组与B中的多条元组对应。这种关系允许存在一条元组对应多条实体集。
除了依赖关系外,还有一类特殊的约束条件,称为主键约束(Primary Key Constraint),它定义了某个属性的值在一个实体集内应当唯一且完整,并且它也是关系模型的基本构建模块。另外,还存在很多其它类型的约束条件,如非空约束(Not Null Constraint)、唯一约束(Unique Constraint)、外键约束(Foreign Key Constraint)、检查约束(Check Constraint)等。
#### 2.2.2SQL语言
SQL语言(Structured Query Language)是关系数据库管理系统用来与关系数据库进行通信的语言。它提供了很多数据操控指令,如SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等,它们都是用来对数据库进行各种操作。
#### 2.2.3视图
视图(View)是一种虚拟的表,是基于特定条件过滤、投影后的结果集,它隐藏了底层表的复杂性,使得用户只看到自己感兴趣的部分。
#### 2.2.4事务
事务(Transaction)是指作为单个逻辑工作单元执行的一组操作。事务必须具有4个属性(ACID):原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。
### 2.3索引
索引(Index)是数据库为了加快数据的检索速度,根据一定规则对数据库表或视图中的数据项进行排序的一种数据结构。索引是在存储引擎级别实现的。索引可以减少磁盘I/O,增加查询效率,同时也可以加速表的搜索。
#### 2.3.1索引的分类
根据建立索引的目的,索引可以分为以下几类:
- 主键索引(Primary key index):保证主码的唯一性,是关系数据库的最佳选择。
- 普通索引(Non-primary key index):不但保证主码的唯一性,而且还为其他列提供快速查找的功能。
- 聚集索引(Clustered Index):表的数据行按照物理顺序排列,因此数据访问时会按照物理顺序从页读取数据,这种索引只能有一个。
- 辅助索引(Secondary index):不是聚集索引,它补充了非聚集索引所需要的排序操作。
#### 2.3.2索引的优点
使用索引的优点:
- 提高了检索速度,降低了系统开销;
- 大大减少了数据库查询的时间,尤其是在大表的情况下;
- 可防止数据错误,保证数据的正确性;
- 可以通过相关性排序找到相关的数据,提高了查询效率。
#### 2.3.3索引失衡
当某些索引对查询性能影响较小时,可能导致其他索引变得过度滥用,出现严重的索引失衡现象。索引失衡会导致索引查找的效率下降,甚至查询计划生成失败,进而影响系统性能。要避免索引失衡,可以通过以下策略进行优化:
- 使用合适的索引字段,不要索引过长字符串、大文本字段;
- 不要频繁修改索引字段,否则可能会造成大量的物理操作;
- 对热点字段建立聚集索引;
- 定期维护索引和统计信息,确保索引准确无误。
### 2.4数据库范式
范式(Normalization)是基于关系理论,它规定了关系数据库表中域(Attribute)之间的联系,目的是为了让关系模型满足第三范式(Third Normal Form)。
#### 2.4.1第一范式
第一范式(First Normal Form,1NF)是最基本的范式,要求每个属性都是不可再分的原子值或组合。
#### 2.4.2第二范式
第二范式(Second Normal Form,2NF)是消除非主属性对主码的部分函数依赖的过程。换言之,就是将主码从多值属性拆分到一张单独的码表中,然后将这个码表与另一张表建立联系。
2NF前的设计模式
|Order|Customer|Item|Price|Quantity|
|---|---|---|---|---|
|order_id|customer_name|item_description|price|quantity|
|-------------|----------------------|----------------------|----------|--------------|
|1|John Smith|Chair|$200|1|
|2|Jane Doe|Desk|$150|1|
经过2NF的设计模式
|Order|Customer|Item|Price|Quantity|
|---|---|---|---|---|
|order_id|customer_name|item_description|price|quantity|
|-------------|----------------------|----------------------------------|---------------|--------------|
|1|John Smith|Chair|$200|1|
|2|Jane Doe|Desk|$150|1|
|Item|Price|Quantity|
|---|---|---|
|item_description|price|quantity|
|------------------------|---------|-----------|
|Chair|$200|1|
|Desk|$150|1|
#### 2.4.3第三范式
第三范式(Third Normal Form,3NF)是消除主属性对于码的传递依赖的过程。换言之,就是将一个实体的主属性值都直接放在码表中,然后再建立另一张表与码表建立联系。这样做可以简化查询、提高效率,同时也符合模式的最终要求。
3NF前的设计模式
|Employee|Department|Manager|Job Title|Salary|Start Date|End Date|
|---|---|---|---|---|---|---|
|employee_id|department_id|manager_employee_id|job_title|salary|start_date|end_date|
|---------------|----------------------|-----------------------|----------|---------------|----------|----------|
|1|1|null|Manager|$50,000|Jan 1st, 2020|null|
|2|1|1|Staff|$40,000|Feb 1st, 2020|Dec 31st, 2022|
|3|2|1|Trainee|$30,000|Mar 1st, 2021|Jun 30th, 2021|
经过3NF的设计模式
|Employee|Department|Job Title|Salary|Start Date|End Date|
|---|---|---|---|---|---|
|employee_id|department_id|job_title|salary|start_date|end_date|
|---------------|----------------------|-----------------------|----------|---------------|----------|
|1|1|Manager|$50,000|Jan 1st, 2020|null|
|2|1|Staff|$40,000|Feb 1st, 2020|Dec 31st, 2022|
|3|2|Trainee|$30,000|Mar 1st, 2021|Jun 30th, 2021|
|Department|Manager|Job Title|Salary|Start Date|End Date|
|---|---|---|---|---|---|
|department_id|manager_employee_id|job_title|salary|start_date|end_date|
|--------------------|-----------------------|---------------|----------|--------------|---------------|
|1|null|Manager|$50,000|Jan 1st, 2020|null|
|1|1|Staff|$40,000|Feb 1st, 2020|Dec 31st, 2022|
|2|1|Trainee|$30,000|Mar 1st, 2021|Jun 30th, 2021|
|Job Title|Salary|Start Date|End Date|
|---|---|---|---|
|job_title|salary|start_date|end_date|
|----------------------|-----------|--------------|---------------|
|Manager|$50,000|Jan 1st, 2020|null|
|Staff|$40,000|Feb 1st, 2020|Dec 31st, 2022|
|Trainee|$30,000|Mar 1st, 2021|Jun 30th, 2021|
综上所述,范式越高,数据冗余越小,查询效率越高,但也越难维护。
### 2.5SQL语句与查询优化
SQL语句(Structured Query Language)是关系数据库管理系统用来与关系数据库进行通信的语言。它提供了很多数据操控指令,如SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等,用来对数据库进行各种操作。
查询优化器(Query Optimizer)是关系数据库管理系统用来生成查询执行计划的工具。它根据查询语句的结构、语法、索引、统计信息、资源使用情况等因素生成一个高效的查询执行计划。
#### 2.5.1索引选取方法
索引的选取方法有一下几种:
- 创建唯一性索引:索引的唯一性可以保证数据的完整性和数据的唯一性,提高查询效率。
- 创建复合索引:一般情况下,复合索引需要包含所有的查询条件,但是在有些情况下,可以考虑仅仅包含必要的查询条件。
- 创建空间索引:空间索引用来加速地理空间数据的处理,主要用来提升对空间数据的处理效率。
- 创建全文索引:全文索引用来支持全文检索操作,它使用正则表达式将数据转换为词项,然后建立倒序索引,支持类似于mysql的match against关键字。
- 创建聚集索引:聚集索引的叶子节点指向的数据都是按照顺序存储的,可以加快范围查询的效率。
- 创建哈希索引:哈希索引可以加速数据查询,其索引结构就是哈希表,但是它的缺点是无法排序和范围查询。
#### 2.5.2查询优化的方法
查询优化方法有一下几种:
- 尽可能使用索引覆盖:一个索引包含所有查询涉及到的字段,可以大大加快查询速度。
- 避免不必要的索引扫描:避免查询中包含那些不需要的列,减少不必要的IO,降低查询效率。
- 使用explain命令查看执行计划:explain命令显示了查询优化器生成的执行计划,分析查询是否可以使用索引,查询扫描的行数等。
- 分区表分片:当表的行数超过一定阈值时,可以使用分区表分片,将表按照一定规则划分为多个小表,可以有效缓解热点问题。
- 启用慢日志:启用慢日志可以捕获查询的运行时间超过指定阈值的语句,通过分析慢日志可以找出不合理的查询行为。
### 2.6数据库安全
数据库安全(Database Security)是指保障数据库数据的安全、私密、可用性和访问权限。数据库安全包括身份认证、授权、审计、访问控制、数据加密、配置管理、备份恢复、漏洞检测等。
#### 2.6.1身份认证与访问控制
身份认证(Authentication)是指验证用户登录的过程,即确定用户输入的用户名和密码是否匹配。访问控制(Access Control)是指决定哪些用户能访问哪些数据,以及限制用户在数据上进行什么操作。
#### 2.6.2授权
授权(Authorization)是指为用户分配访问系统权限的过程,是一种细粒度的访问控制机制,它允许管理员精细地控制用户对数据库对象的访问权限。授权策略可以是基于角色的、基于资源的、基于属性的,可以灵活地控制用户对数据库的访问权限。
#### 2.6.3审计
审计(Auditing)是指跟踪数据库活动的过程,它记录数据库的各种操作、时间、人员、结果等信息,帮助管理员了解数据库的安全状况、异常事件、和未授权访问等。审计信息可以写入日志文件、数据库表、或事件监视器中。
#### 2.6.4数据加密
数据加密(Data Encryption)是指对敏感信息在传输过程中加密,从而保护信息的机密性、完整性和可用性。
#### 2.6.5配置管理
配置管理(Configuration Management)是指对数据库环境的配置进行文档化、标准化、集中管理,从而减少环境配置的差异性、错误发生的概率,方便日后维护和管理。
#### 2.6.6备份与恢复
备份(Backup)是指备份数据库的过程,它可以帮助防止数据丢失、损坏或篡改。备份策略可以是定时备份、定期备份、智能备份,也可以手工备份。
恢复(Recovery)是指从备份中恢复数据的过程,它可以从各种介质中重新创建原始数据副本,帮助数据库快速恢复正常状态。
#### 2.6.7漏洞检测
漏洞检测(Vulnerability Detection)是指识别数据库系统中潜在弱点的过程,它可以帮助管理员识别数据库系统中存在的安全漏洞,及时修复,从而提高数据库系统的安全性和可用性。
### 2.7性能优化
性能优化(Performance Optimization)是指对数据库系统进行调整、提高数据库运行效率的过程,包括查询优化、数据库服务器参数优化、索引优化、系统架构优化、查询调优等。
#### 2.7.1查询优化
查询优化(Query Optimization)是指通过改变查询的语法或索引的顺序来优化查询的过程。
#### 2.7.2数据库服务器参数优化
数据库服务器参数优化(Database Server Parameter Tuning)是指通过调整数据库服务器的参数,优化数据库系统的运行性能的过程。
#### 2.7.3索引优化
索引优化(Indexing Optimization)是指优化数据库的索引的过程,包括选择合适的索引列、使用有效的索引类型、设置索引列顺序、设置索引列长度等。
#### 2.7.4系统架构优化
系统架构优化(System Architecture Optimization)是指优化数据库系统架构的过程,包括数据库负载均衡、应用程序服务器的优化、数据库缓存的使用、分布式数据库的部署等。
#### 2.7.5查询调优
查询调优(Query Tuning)是指对数据库系统中的查询进行优化的过程,包括调整查询计划、调整查询参数、查询缓存的使用等。
### 2.8数据库运维
数据库运维(Database Operations)是指对数据库进行日常维护、管理、运营的过程。数据库运维包括数据库维护、数据备份与恢复、故障诊断、容量规划、数据库性能评估、数据迁移、数据共享、工具和脚本的开发、数据库的监控等。
#### 2.8.1数据库维护
数据库维护(Database Maintenance)是指对数据库进行定期维护、清理、升级、测试、以及数据库系统的扩容等,保持数据库的稳定运行。
#### 2.8.2数据备份与恢复
数据备份与恢复(Backup & Recovery)是指备份数据库的数据、日志文件、配置文件、以及应用程序数据,并在发生灾难性故障之后,利用备份数据进行数据恢复的过程。
#### 2.8.3故障诊断
故障诊断(Troubleshooting)是指识别并解决数据库故障的过程。
#### 2.8.4容量规划
容量规划(Capacity Planning)是指预测数据库系统的增长,并确立数据库的容量规划目标,防止突发扩展的情况发生的过程。
#### 2.8.5数据库性能评估
数据库性能评估(Database Performance Evaluation)是指对数据库系统进行定期评估,判断数据库系统的运行性能是否达到预期水平的过程。
#### 2.8.6数据迁移
数据迁移(Data Migration)是指将一个数据库的数据转移到另一个数据库的过程,帮助用户完成数据库的迁移工作。
#### 2.8.7数据共享
数据共享(Data Sharing)是指将不同数据库的相同或相关数据集成到一起的过程,并协调数据库之间的同步。
#### 2.8.8工具和脚本的开发
工具和脚本的开发(Tools and Scripts Development)是指开发数据库系统相关的管理工具和脚本的过程,如数据导入导出、报告生成、数据分析、数据备份恢复等。
#### 2.8.9数据库的监控
数据库的监控(Database Monitoring)是指收集数据库系统运行数据,并通过分析数据提高数据库系统的运行效率,提升数据库系统的运营效率的过程。
### 2.9数据库工具
数据库工具(Database Tools)是指为数据库管理员和数据库管理者使用的数据库系统的管理、维护、监控等工具的集合。
#### 2.9.1数据库管理工具
数据库管理工具(Database Administration Tool)是指为数据库管理员使用的数据库系统的管理工具的集合。
#### 2.9.2数据库维护工具
数据库维护工具(Database Maintenance Tool)是指为数据库维护者使用的数据库系统的维护工具的集合。
#### 2.9.3数据库监控工具
数据库监控工具(Database Monitor Tool)是指为数据库管理员和数据库管理者使用的数据库系统的监控工具的集合。
## 3.MySQL数据库
数据库系统是对存储在计算机中的数据的逻辑和数据的结构的组织形式的描述。MySQL是目前最流行的开源关系数据库管理系统,它被广泛应用于许多互联网公司和大型组织。下面介绍MySQL数据库的基本概念和功能。
### 3.1数据库与数据字典
数据库(database)是一个仓库,里面存储着数据。在MySQL中,数据库分为逻辑数据库(logical database)和物理数据库(physical database),物理数据库又叫做存储引擎(storage engine)。逻辑数据库是指用户自定义的数据库名称,可以保存多个物理数据库。
每一个数据库都有一个数据字典(data dictionary),它用来存储数据库中各种对象(table、view、index、sequence、trigger等)的相关信息。
### 3.2数据库对象
数据库对象(database object)是指数据库中的数据结构、描述数据、行为等的集合。数据库对象有五种:表(table)、视图(view)、索引(index)、序列(sequence)、触发器(trigger)。
表是数据组织形式最简单的数据库对象,它存储着结构化的数据。表由一系列的行和列组成,每一行代表一条记录,每一列代表相应记录中的一个字段。
视图(view)是一种虚表,它是一种基于数据库中的其他表的定义,而不是真实表中的数据,视图对外部表的呈现形式进行了一定的控制。
索引(index)是加快数据库查找的关键技术。索引是一个特殊的的数据结构,它在一个或多个列上创建一个数据结构,以便更快速地查询数据。
序列(sequence)是一种特殊的数据库对象,它自动生成连续的整数。
触发器(trigger)是一种在特定事件(insert、update、delete)发生时自动执行的数据库操作。
### 3.3SQL语言
SQL(Structured Query Language)是关系数据库管理系统用来与关系数据库进行通信的语言。它提供了很多数据操控指令,如SELECT、INSERT、UPDATE、DELETE、CREATE、ALTER、DROP等,用来对数据库进行各种操作。
### 3.4数据类型
MySQL数据库支持的最常用的数据类型有以下几种:
INT(integer):整型,支持整数、负数,数据宽度不超过64位。
FLOAT(float):浮点型,用于存储带小数的数字,数据宽度不超过64位。
DOUBLE(double precision):双精度浮点型,与FLOAT相比,能够提供更高的精度,数据宽度不超过64位。
VARCHAR(variable character):变长字符串类型,可存储变长字符,如短信验证码、姓名、邮件地址等。
TEXT(text):用于存储长文本数据,如文章、评论、日志等。
DATE(date):日期类型,存储YYYY-MM-DD形式的日期。
TIME(time):时间类型,存储HH:MM:SS形式的时间。
DATETIME(datetime):日期时间类型,存储YYYY-MM-DD HH:MM:SS形式的日期时间。
BOOLEAN(boolean):布尔类型,存储True、False值。
ENUM(enumeration):枚举类型,用于限定列只能选择枚举中的一个值。
SET(set):集合类型,用于存储一组不同的值。
### 3.5MySQL的安装和使用
MySQL的安装和使用有如下几个步骤:
1.下载安装包:从MySQL官网上下载最新版的MySQL安装包。
2.配置环境变量:下载完毕后,解压MySQL压缩包,进入解压目录,将bin、lib和share三个文件夹添加到PATH、LD_LIBRARY_PATH和MYSQL_HOME路径中,这样就可以全局调用MySQL的命令。
3.启动服务:进入MySQL安装目录的bin文件夹,执行如下命令启动MySQL服务:
```
mysqld --initialize
mysqld --install
service mysql start
```
4.连接服务:执行如下命令连接MySQL服务:
```
mysql -u root -p
```
5.创建数据库:连接成功后,可以创建数据库。假设要创建名为testdb的数据库,可以使用如下命令:
```
create database testdb;
```
6.创建表:创建数据库后,可以创建表。假设要在testdb数据库中创建一个名为students表,包含如下字段:姓名、性别、班级、学号、手机号码,可以使用如下SQL语句:
```
CREATE TABLE students (
name VARCHAR(50),
gender CHAR(1),
class VARCHAR(50),
id INT,
mobile_number VARCHAR(50));
```
7.插入数据:创建表后,可以向表中插入数据。假设要向students表中插入三条记录,可以使用如下SQL语句:
```
INSERT INTO students VALUES
('Tom', 'M', '101', 1, '18912345678'),
('Jerry', 'M', '102', 2, '18912345678'),
('Lucy', 'F', '101', 3, '18912345678');
```
8.查询数据:创建表、插入数据后,可以使用SELECT语句查询数据。假设要查询students表中所有记录,可以使用如下SQL语句:
```
SELECT * FROM students;
```
代码解读
下面给出一些常用的SQL命令:
创建数据库 :
create database 数据库名;
代码解读
删除数据库 :
drop database if exists 数据库名;
代码解读
创建表 :
CREATE TABLE table_name (
column_name1 data_type(size),
column_name2 data_type(size),
column_name3 data_type(size),
...
);
代码解读
创建唯一索引 :
ALTER TABLE table_name ADD UNIQUE INDEX index_name (column_name);
代码解读
创建普通索引 :
ALTER TABLE table_name ADD INDEX index_name (column_name);
代码解读
创建主键索引 :
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
代码解读
删除索引 :
DROP INDEX index_name ON table_name;
代码解读
插入数据 :
INSERT INTO table_name (column1,column2,...) VALUES (value1, value2,...);
代码解读
更新数据 :
UPDATE table_name SET column1 = value1 WHERE condition;
代码解读
查询数据 :
SELECT column1, column2,... FROM table_name WHERE condition;
代码解读
删除数据 :
DELETE FROM table_name WHERE condition;
代码解读
创建视图 :
CREATE VIEW view_name AS select_statement;
代码解读
删除视图 :
DROP VIEW IF EXISTS view_name;
代码解读
数据库大小 :
SELECT DATABASE(),ROUND((DATA_LENGTH + INDEX_LENGTH)/1024/1024,2) "Size in MB"
FROM information_schema.TABLES
ORDER BY DATA_LENGTH+INDEX_LENGTH DESC LIMIT 10;
代码解读
全部评论 (0)
还没有任何评论哟~
