MySQL 数据库基础理论
MySQL 数据库基础理论
一、数据库概念
1.1 数据
描述事物的符号记录,可以是数字、文字、图形、图像、声音、语言等,数据有多种形式,它们都可以经过数字化后存入计算机
1.2 数据库
存储数据的仓库,是长期存放在计算机内、有组织、可共享的大量数据的集合
数据库中的数据按照一定数据模型组织、描述和存储,具有较小的冗余度,较高的独立性和易扩展性,并为各种用户共享,总结为以下几点:
- 数据结构化
- 数据的共享性高,冗余度低,易扩充
- 数据独立性高
- 数据由 DBMS 统一管理和控制(安全性、完整性、并发控制、故障恢复)
1.3 常见数据库
1.3.1 关系型数据库
关系数据库是建立在关系模型基础上的数据库,借助于集合代数等数学概念和方法来处理数据库中的数据。
关系模型就是指
二维表格模型, 因而一个关系型数据库就是由二维表及其之间的联系组成的一个数据组织。当前主流的关系型数据库有:
Oracle、DB2、Microsoft SQL Server、MicrosoftAccess、MySQL、PostgreSQL、浪潮K-DB、武汉达梦、南大通用、人大金仓、华为高斯(mysql核心的二次研发)、mariadb(mysql作者在mysql收购后研发的)等
实体关系模型简称 E-R 模型,是一套数据库的设计工具,他运用真实世界中事物与关系的观念,来解释数据库中的抽象的数据架构。实体关系模型利用图形的方式(实体-关系图)来表示数据库的概念设计,有助于设计过程中的构思及沟通讨论。
1.3.2 非关系型数据库
非关系型数据库又被称为 NoSQL(Not Only SQL ),意为不仅仅是 SQL, 是一种轻量、开源、不兼容 SQL 功能的数据库, 对 NoSQL 最普遍的定义是“非关联型的”,强调Key-Value 存储和文档数据库的优点,而不是单纯地反对 RDBMS(关系型数据库管理系统)
- 典型数据库:redis、mongodb
二、数据库管理系统(DBMS)
2.1 概念
数据库管理系统(DataBase ManagermentSystem,简称DBMS)是管理数据库的一个软件,它充当所有数据的知识库,并对它的存储、安全、一致性、并发操作、恢复和访问负责。是对数据库的一种完整和统一的管理和控制机制
DBMS有一个数据字典(有时被称为系统表),用于贮存它拥有的每个事物的相关信息,例如名字、结构、位置和类型,这种关于数据的数据也被称为元数据(metadata)

2.2 DBMS支持的数据模型

-
层次模型:
满足以下条件的数据模型称为层次模型:- 有且仅有一个节点无父节点,这个节点称为根节点
- 其他节点有且仅有一个父节点。桌面型的关系模型数据库

-
网状模型:
网状模型是一个网络。在数据库中,满足以下两个条件的数据模型称为网状模型- 允许一个以上的节点无父节点;
- 一个节点可以有多于一个的父节点,从以上定义看出,网状模型构成了比层次结构复杂的网状结构,适宜表示多对多的联系。

-
关系(表)模型:
以二维表的形式表示实体和实体之间联系的数据模型称为关系数据模型。从模型的三要素角度看,关系模型的内容为:- 数据结构:一张二维表格
- 数据操作:数据表的定义、检索、维护、计算等
- 数据约束条件:表中列的取值范围即域值的限制条件

三、MySQL 概述
3.1 概念
MySQL是一个小型关系数据库管理系统

目前 MySQL 被广泛地应用在 Internet 上的中小型网站中。由于体积小、速度快、总体拥有成本低,尤其是开放源代码这一特点,许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。
3.2 特点
- 使用 C 和 C++ 编写,并使用了多种编译器进行测试,保证源代码的可移植性
- 支持 AIX、BSDi、FreeBSD、HP-UX、Linux、Mac OS、Novell Netware、NetBSD、OpenBSD、OS/2 Wrap、Solaris、SunOS、Windows 等多种操作系统。
- 为多种编程语言提供了 API。这些编程语言包括 C、C++、C#、Delphi、Eiffel、Java、Perl、PHP、Python、Ruby 和 Tcl 等。
- 支持多线程,充分利用 CPU 资源,支持多用户,优化的 SQL 查询算法,有效地提高查询速度
- 既能够作为一个单独的应用程序应用在客户端服务器网络环境中,也能够作为一个库而嵌入到其他的软件中。
- 提供多语言支持,常见的编码如中文的 GB 2312、BIG5,日文的 Shift_JIS 等都可以用作数据表名和数据列名。
- 提供 TCP/IP、ODBC 和 JDBC 等多种数据库连接途径
- 提供用于管理、检查、优化数据库操作的管理工具
- 可以处理拥有上千万条记录的大型数据库
MySQL 的四个特性(事务):
- A(Atomicity):原子性,保证事务中的所有操作要么全部成功,要么全部失败
- C(Consistency):一致性,确保事务执行前后,数据库始终处于一致的状态
- I(Isolation):隔离性,保证多个事务并发执行时,彼此不会互相干扰
- D (Durability):持久性,保证事务一旦提交,其对数据库的修改是永久性的,即使系统崩溃也不会丢失数据
四、MySQL架构
共分为四层:网络连接层、数据库服务层、存储引擎层、系统文件层

4.1 网络连接层
MySQL是一个单进程多线程架构的数据库,通过数据库连接池处理所有客户端接入的工作
如何连接:
- 当输入命令
mysql -h 127.0.0.1 -uroot -p123456后 MySQL 服务端与客户端会基于TCP/IP协议栈连接,期间会检查用户名、密码、权限等 - 数据库连接建立成功后,MySQL 服务端与客户端之间会采用半双工的通讯机制工作
- 同时 MySQL 会安排一条线程维护当前客户端的连接,这条线程也会时刻标识着当前连接在干什么工作,可以通过
show processlist;命令查询所有正在运行的线程:

event_scheduler:事件调度器账户
所有的客户端连接都需要一条线程去维护,而线程资源无论在哪里都属于宝贵资源,因此不可能无限量创建
- 数据库连接池(Connection Pool):为了复用线程、管理线程以及限制最大连接数
- 连接池的最大线程数可以通过参数
max-connections来控制,如果到来的客户端连接超出该值时,新到来的连接都会被拒绝
关于最大连接数的一些命令主要有两条:show variables like '%max_connections%';:查询目前 DB 的最大连接数set GLOBAL max_connections = 200;:修改数据库的最大连接数为指定值
- MySQL 本身还会对客户端的连接数进行统计,可以通过命令命令
show status like "Threads%";查询

其中各个字段的释义如下:
- 连接池的最大线程数可以通过参数
- Threads_cached :目前空闲的数据库连接数
- Threads_connected :当前数据库存活的数据库连接数
- Threads_created : MySQL-Server 运行至今,累计创建的连接数
- Threads_running :目前正在执行的数据库连接数
4.2 数据库服务层
MySQL 大多数核心功能都位于这一层
- 包括客户端 SQL 请求解析、语义分析、查询优化、缓存以及所有的内置函数(例如:日期、时间、统计、加密函数…)
- 所有跨引擎的功能都在这一层实现,存储过程、触发器和视图等一系列服务

-
SQL接口组件
- 作用:接收客户端的 SQL 命令,比如 DML、DDL 语句以及存储过程、触发器等。当收到 SQL 语句时,SQL 接口会将其分发给其他组件,然后等待接收执行结果的返回,最后会将其返回给客户端
- SQL 语句分为五大类:
- DCL:数据库控制语句,比如 grant、revoke 控制权限的语句
- DDL:数据库定义语句,比如 create、alter、drop
- DML:数据库操作语句,比如 update、delete、insert
- DQL:数据库查询语句,比如最常见的 select
- TCL:事务控制语句,例如 commit、rollback、setpoint 等语句
-
解析器:主要作用是词法分析、语义分析、语法树生成等等,即验证 SQL 语句是否正确,以及将 SQL 语句解析成 MySQL 能看懂的机器码指令
-
优化器:作用是生成执行计划,比如选择最合适的索引,选择最合适的 join 方式等,最终会选择出一套最优的执行计划,维护当前连接的线程会负责根据计划去执行 SQL
-
缓存和缓冲区
-
读取缓存(主要是 select 语句)
- 作用: MySQL 会对于一些经常执行的查询 SQL 语句,将其结果保存在 Cache 中,因为这些 SQL经常执行,因此如果下次再出现相同的 SQL 时,能从内存缓存中直接命中数据,自然会比走磁盘效率更高
- 高版本的 MySQL 中,移除了查询缓存区,因为命中率不高,而且查询缓存这一步还要带来额外开销,同时一般程序都会使用 Redis 做一次缓存
-
写入缓冲区 (减少大量的磁盘 IO ,从而进一步提高数据库整体性能)
- 缓冲区的设计主要是:为了通过内存的速度来弥补磁盘速度较慢对数据库造成的性能影响
- 数据库进行 写操作 时,(都会先从缓冲区中查询是否有要操作的页,如果有,则直接对内存中的数据页进行操作(例如修改、删除等),对缓冲区中的数据操作完成后,会直接给客户端返回成功的信息,然后 MySQL 会在后台利用一种名为 Checkpoint 的机制,将内存中更新的数据刷写到磁盘)
-
4.3 存储引擎层
存储引擎也可以理解成 MySQL 最重要的一层,引擎层则负责具体的数据操作以及执行工作
- MySQL 因为其开源特性,存在很多款不同的存储引擎实现,MySQL 为了能够正常搭载不同的存储引擎运行,因此引擎层是被设计成可拔插式的,也就是可以根据业务特性,为自己的数据库选择不同的存储引擎

MySQL 目前有非常多的存储引擎可选择,其中最为常用的则是 InnoDB 与 MyISAM 引擎,可以通过show variables like '%storage_engine%'; 命令来查看当前所使用的引擎
- 引擎也不仅仅只负责数据的管理,也会负责库表管理、索引管理等,MySQL 中所有与磁盘打交道的工作,最终都会交给存储引擎来完成
4.4 文件系统层
文件系统层分为两个板块日志板块和数据板块。该层是 MySQL 数据库的基础

本质上就是基于机器物理磁盘的一个文件系统,其中包含了配置文件、库表结构文件、数据文件、索引文件、日志文件等各类 MySQL 运行时所需的文件,这一层的功能比较简单,也就是与上层的存储引擎做交互,负责数据的最终存储与持久化工作
日志板块:
- binlog 二进制日志,主要记录 MySQL 数据库的所有 写操作(增删改)
- redo-log 重做/重写 日志, MySQL 崩溃时,对于未落盘的操作会记录在这里面,用于重启时重新落盘( InnoDB 专有的)
- undo-logs 撤销/回滚 日志:记录事务开始前[修改数据]的备份,用于回滚事务
- error-log :错误日志,记录 MySQL 启动、运行、停止时的错误信息
- general-log 常规日志,主要记录 MySQL 收到的每一个查询或 SQL 命令
- slow-log :慢查询日志,主要记录执行时间较长的 SQL
- relay-log :中继日志,主要用于主从复制做数据拷贝
数据板块:MySQL 的所有数据最终都会写入到磁盘,而不同的数据在磁盘空间中,存储的格式也并不相同
- db.opt 文件:主要 记录 当前数据库使用的字符集和验证规则等信息
- .frm 文件:存储 表结构的元数据信息文件,每张表都会有一个这样的文件
- .MYD 文件:用于 存储 表中所有数据的文件( MyISAM 引擎独有的)
- .MYI 文件:用于 存储 表中索引信息的文件( MyISAM 引擎独有的)
- .ibd 文件:用于 存储 表数据和索引信息的文件( InnoDB 引擎独有的)
- .ibdata 文件:用于 存储 共享表空间的数据和索引的文件( InnoDB 引擎独有)
- .ibdata1 文件:这个主要是用于 存储 MySQL 系统(自带)表数据及结构的文件。
- .ib_logfile0/.ib_logfile1 文件:用于故障数据恢复时的日志文件
- .cnf/.ini : MySQL 的配置文件, Windows 下是 .ini ,其他系统大多为 .cnf
- … …

更多推荐
所有评论(0)