1 ~> 什么是数据库?
数据库(Database,DB)是按照一定结构组织、存储和管理数据的电子仓库。
为什么需要数据库呢?
比如你在做一个网站,需要保存用户信息:
| id | 用户名 | 密码 | 年龄 |
|---|
| 1 | 张三 | ****** | 20 |
| 2 | 李四 | ****** | 22 |
| 3 | 王五 | ****** | 21 |
这些数据如果只保存在一个普通文件中,一旦数据量变得比较大时,想要查询、修改和管理就变得非常困难了。所以,引入了数据库来管理。
数据库存储介质:
主流数据库:
- SQL Server:微软的产品,.NET 程序员的最爱,中大型项目。
- Oracle Database:甲骨文产品,适合大型项目,复杂的业务逻辑,并发一般来说不如 MySQL。
- MySQL:世界上最受欢迎的数据库,属于甲骨文,并发性好,不适合做复杂的业务。主要用在电商、SNS、论坛。
- PostgreSQL:加州大学伯克利分校计算机系开发的关系型数据库,不管是私用、商用,还是学术研究使用,可以免费使用、修改和分发。
- SQLite:是一款轻型的数据库,是遵守 ACID 的关系型数据库管理系统,它包含在一个相对小的 C 库中。它的设计目标是嵌入式的,而且目前已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。
- H2: 是一个用Java开发的嵌入式数据库,它本身只是一个类库,可以直接嵌入到应用项目中。
2 ~> MySQL 在 CentOS 7 环境安装
说明:我们直接在 root 权限下操作!
步骤一:卸载不需要的环境
有些系统可能自带 MySQL、MariaDB(MySQL 的开源分支、完全兼容 MySQL,绝大多数语法、API、配置几乎一模一样),我们需要先将它们卸载。
检查是否存在 MySQL / MariaDB:
- ps axj | grep maridb
- ps axj | grep mysql
复制代码
我的系统下载了 MySQL,所以可以看到,但是不存在 MariaDB。
如果存在,还需要关掉服务:
- systemctl stop maridb.service
- systemctl stop mysql.service
复制代码
步骤二:卸载默认安装包
查看有哪些安装包:
- rpm -qa | grep maridb
- rpm -qa | grep mysql
复制代码
卸载安装包:
- // 方案一:一次性全部卸载
- yum remove mysql-community* -y
- // 方案二:一个一个卸载
- yum remove mysql-community-common-5.7.44.1.el7.x86_64
- yum remove mysql-community-client-5.7.44.1.el7.x86_64
- ...
复制代码
步骤三:获取MySQL官方yum源
获取mysql官方yum源:
http://repo.mysql.com/
点击链接进入官网,然后右击鼠标点击“查看网页源代码”。
例如:mysql57-community-release-el7-8.noarch.rpm
- mysql57:代表 MySQL 5.7 版本
- community:社区版
- release:这是一个yum 源 rpm 包
- el7:Enterprise Linux 7,对应 CentOS7/RHEL7
我的云服务器为Centos 7.8所以我选择mysql57-community-release-el7-8.noarch.rpm,点击之后就会自动下载。
- # 查看自己的系统版本
- cat /etc/redhat-release
复制代码
安装包如下图所示:
然后将安装包上传到云服务器:
步骤四:安装yum 源
- # 安装
- rpm -Uvh mysql57-community-release-el7-8.noarch.rpm
复制代码- # 查看有没有安装成功
- ls /etc/yum.repos.d/ -al
复制代码
步骤五:安装MySQL 服务
- # 安装服务
- yum install -y mysql-community-server
复制代码
可能遇到下面的问题:
- # 安装遇到密钥过期的问题:
- Failing package is: mysql-community-client-5.7.39-1.el7.x86_64
- GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
复制代码- # 解决方案:执行下面的命令
- rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
复制代码
步骤六:查看配置文件和数据存储位置
- # 配置文件
- ls /etc/my.cnf
- # 数据库文件
- ls /var/lib/mysql
复制代码
步骤七:启动服务并查看
- # 启动MySQL 服务端
- systemctl start mysql.service
- # 或者
- systemctl start mysqld
- # 查看
- ps axj | grep mysqld
复制代码
- # 关闭mysql 服务端
- systemctl stop mysqld
复制代码
步骤八:登录 MySQL
刚开始我们并不知道密码,所以,先配置为免密码登录。
- # 打开配置文件
- vim /etc/my.cnf
- # 在最后面添加:
- skip-grant-tables
- # 保存退出即可
- shift + ; + wq
复制代码
然后登录:
- # 登录:
- # -u 指定身份
- # -p 指定密码
- mysql -u root -p
复制代码
由于我们设置了免密码登录,所以直接回车就登录进去了。
想要退出:直接输入quit即可!
步骤九:简单配置
MySQL 本质是一个基于客户端-服务端模式的网络服务。
- MySQL 服务监听的 TCP 端口,默认 3306。
- 客户端连接数据库就访问这个端口;可以修改为别的端口,改完要重启 mysqld 服务生效。
注意:改端口之后,连接时需要加 -P端口号,例如 mysql -uroot -p -P3307。
将MySQL 服务端的字符集配置为:utf8。
将存储引擎配置为:默认使用 InnoDB 存储引擎。
- # 打开配置文件
- vim /etc/my.cnf
- # 插入选项
- port=3306
- character-set-server=utf8
- default-storage-engine=innodb
- # 保存退出
- shift + ; + wq
复制代码
重启 MySQL 服务后生效。
- # 重启
- systemctl restart mysqld
复制代码
3 ~> MySQL 基础
3.1 服务器,数据库,表关系
所谓安装数据库服务器,只是在机器上安装了一个数据库管理系统程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库。
为保存应用中实体的数据,一般会在数据库中创建多个表,以保存程序中实体的数据。
数据库服务器、数据库和表的关系如下:
3.2 MySQL 基本使用
3.2.1 启动 MySQL 服务端
3.2.2 连接 MySQL 服务器
- mysql -u root -p -h 127.0.0.1 -P 3306
复制代码
注意:
- 如果没有写 -h 127.0.0.1,默认是连接本地。
- 如果没有写 -P 3306,默认是连接 3306 端口号。
netstat -nltp 查看网络服务:
3.2.3 使用案例
数据库就是 /var/lib/mysql 路径下的目录文件。
注意:命令后面需要加“;”。
在创建表之前,要在哪个数据库建表,就要先使用该数据库:
- # 使用数据库
- use db_name
- # 建表
- create table student(
- id int,
- name varchar(32),
- gender varchar(2)
- );
复制代码
- # 全列插入
- insert into student (id, name, gender) values(1, '张三', '男');
- insert into student (id, name, gender) values(2, '李四', '女');
- insert into student (id, name, gender) values(3, '王五', '男');
- # 全列插入写法二:
- insert into student values(1, '张三', '男');
- insert into student values(2, '李四', '女');
- insert into student values(3, '王五', '男');
复制代码
3.3 MySQL 架构
MySQL 本质是基于 C/S 模式的网络服务。
- mysql:是客户端
- mysqld:是服务端,所以启动服务是 systemctl start mysqld
3.3.1 MySQL 的客户端
MySQL Client 是用来和 MySQL Server 进行交互的程序。
例如我们在 Linux 终端输入:
这里启动的 mysql 就是一个客户端程序。
它可以:
- 连接 MySQL Server
- 向 MySQL Server 发送 SQL
- 接收 Server 返回的数据
- 把结果显示在终端上
3.3.2 MySQL 的服务端
MySQL Server 是真正负责管理和操作数据库的程序。
它主要负责:
-
保存数据库和表中的数据
-
接收客户端发送的 SQL
-
解析和执行 SQL
-
查询,修改数据
-
管理用户权限
-
返回 SQL 执行结果
例如我们执行:
这条 SQL 是发送给 MySQL Server 执行的。
MySQL 的架构就是围绕 MySQL Server 来构建的。
(1)连接与管理层
职责:负责“接客与安全校验”。处理客户端连接、管理线程池,并校验用户的账号、密码与访问权限。
(2)服务层(Server 层)
职责:负责“思考与调度”。包含解析器和优化器,主要将 SQL 文本解析为语法树,计算出最优执行计划,并向底层发送读写指令(这一层与具体数据库引擎无关)。
(3)可插拔存储引擎层
职责:负责“真正的读写干活”。作为插件可按需切换,不同引擎实现不同的存储机制,如 InnoDB(支持事务和行锁)或 MyISAM(不支持事务但简单轻量)。
(4)物理文件存储层
职责:负责“持久化落盘”。将数据表、索引以及各类日志(Redo Log、Binlog 等)真正保存在操作系统的磁盘或网络存储中。
3.4 SQL 分类
SQL 就是 MySQL 的命令。按照功能的不同,SQL 主要分为以下四类:
| 分类 | 全称 | 作用说明 | 代表指令 | 典型示例 |
|---|
| DDL | Data Definition Language(数据定义语言) | 用来维护存储数据的结构,如创建、删除、修改数据库和表 | create、drop、alter | create database test;、drop table student;、alter table student add column age int; |
| DML | Data Manipulation Language(数据操纵语言) | 用来对表中的数据进行增、删、改操作 | insert、delete、update | insert into student values(1, '张三', '男');、delete from student where id = 1;、update student set name = '李四' where id = 2; |
| DQL | Data Query Language(数据查询语言) | 用来查询表中的数据,是 DML 中单独划分出来的一类 | select | select * from student where id = 10; |
| DCL | Data Control Language(数据控制语言) | 主要负责权限管理和事务控制 | grant、revoke、commit | grant all on *.* to 'root'@'localhost';、revoke all on *.* from 'root'@'localhost';、commit; |
说明:DQL 本质上是 DML 的一部分,但由于 select 查询使用频率极高,通常单独列为一类,方便学习和记忆。
4 ~> 存储引擎
4.1 什么是存储引擎?
MySQL 存储引擎,可以理解为负责“怎么存储和读取表中数据”的组件。
MySQL Server 负责接收和处理 SQL,但具体把数据写到磁盘、怎么读取、怎么建立索引、怎么支持事务,主要由存储引擎负责。
例如执行:
- select * from student where id = 10;
复制代码
MySQL Server 的 SQL 层会负责解析、优化和执行这个 SQL。
真正需要从数据中找到 id = 10 的数据时,就会交给存储引擎。
4.2 常见的存储引擎
MySQL 的核心就是插件式存储引擎,支持多种存储引擎。
现在 MySQL 默认的存储引擎就是 InnoDB。
还有:
InnoDB 负责的事情:
- 数据存储
- 索引
- 事务
- 锁
- MVCC
- Buffer Pool
- 崩溃恢复
- Redo Log等
一个直观的比喻:将 MySQL 想象成图书馆
- MySQL Server = 图书馆
- │
- ├── SQL解析器 = 接待员
- │
- ├── 优化器 = 查找路线规划员
- │
- ├── 执行器 = 执行工作人员
- │
- └── 存储引擎 = 图书仓库管理系统
复制代码
5 ~> 总结
本文介绍了 MySQL 的基础知识,包括数据库、服务器与表的基本概念。
重点讲解了 MySQL 的安装!
并初步了解了 MySQL 的基本使用以及 MySQL 的客户端、服务端架构以及 SQL 分类。
最后介绍了存储引擎的基本概念,为后续学习 InnoDB、索引、事务等 MySQL 核心知识打下基础。