MySQL

MySQL 基础

·20 分钟阅读·7605 字

MySQL 数据库核心知识体系:体系结构、SQL 语句、存储引擎、索引优化、主从复制与高可用

📋 目录

MySQL 基础


一、MySQL 概述

1. 关系型数据库与非关系型数据库

RDBMS(Relational Database Management System)—— 关系型数据库管理系统。

简单来说,关系型数据库是指采用了二维表格来组织数据的数据库。

类型特点代表产品
关系型数据库二维表格组织数据,支持事务 ACIDOracle、MySQL、DB2、SQL Server
非关系型数据库Key/Value 键值对维护数据,高扩展性Redis、MongoDB、Cassandra

关系型数据库的最大特点是事务的一致性,但对事务一致性的维护会消耗较大的系统开销。

2. 什么是事务

事务(Transaction)由一条或多条 SQL 语句组成。在事务操作中,这些 SQL 语句要么全部成功执行,要么全部不执行

3. 事务的 ACID 特性

特性说明通俗理解
原子性(Atomicity)事务中的操作不可分割,要么全部完成,要么均不执行全有或全无
一致性(Consistency)事务执行前后数据库都处于一致状态,不破坏数据完整性和业务逻辑数据不会乱
隔离性(Isolation)事务的执行不受其他事务干扰,中间结果对其他事务透明互不干扰
持久性(Durability)事务提交后,数据修改永久生效,即使系统故障也不会丢失落盘不丢

4. MySQL 体系结构

⚠️ 图片缺失:原文档引用的体系结构图为本地临时文件,未能保存到附件目录。建议补充 MySQL 体系结构图(可用 Draw.io 或 Excalidraw 绘制后放入 90-attachments/)。

MySQL 体系结构从上到下分为:

  1. 连接层:连接池组件,处理客户端连接请求
  2. 服务层:SQL 接口、查询解析器、查询优化器、缓存组件
  3. 引擎层:可插拔存储引擎(InnoDB、MyISAM 等)
  4. 存储层:文件系统与日志存储(数据文件、索引文件、日志文件)

5. 日志文件

日志类型文件名/位置作用
错误日志(Error Log)/data/目录/主机名.err记录数据库启动、停止、运行时的错误信息(重点关注 ERROR 级别)
二进制日志(Binlog)由 log_bin 参数指定记录所有更改操作(DDL/DML/DCL),不包含 SELECT/SHOW 查询语句

二、MySQL 基本 SQL 语句

1. MySQL 客户端工具

# 常用连接参数
mysql -u 用户名 -p 密码 -h 主机地址 -P 端口号 -S socket文件

# 非交互模式执行 SQL
mysql -u root -p -e 'SHOW DATABASES;

`

参数说明
-u / —user指定登录用户名
-p / —password指定登录密码(注意小写 p,建议放到最后)
-h / —host指定数据库主机地址
-P / —port指定数据库端口号(大写 P)
-S / —socket指定 socket 文件
-e / —execute非交互模式执行 SQL

2. 常用管理命令

RELOAD;            -- 刷新授权表
SHUTDOWN;          -- 停止 MySQL 服务
STATUS;            -- 简查看数据库状态
START SLAVE;       -- 启动从库复制
STOP SLAVE;        -- 停止从库复制
SHOW VARIABLES;    -- 查看可用变量
SELECT VERSION();  -- 查看 MySQL 版本信息

3. 什么是 SQL

SQL(Structured Query Language)—— 结构化查询语言,是使用关系模型的数据库应用语言。

4. SQL 语句分类

分类全称作用常见语句
DDLData Definition Language数据定义语言,定义数据库、表、索引等CREATE、ALTER、DROP
DMLData Manipulation Language数据操纵语言,增删改查记录INSERT、UPDATE、DELETE
DQLData Query Language数据查询语言,检索信息SELECT
DCLData Control Language数据控制语言,管理权限和安全级别GRANT、REVOKE

5. 数据库操作

创建数据库:

CREATE DATABASE 数据库名称;

查询数据库:

-- 显示所有数据库
SHOW DATABASES;

-- 显示某个数据库的创建语句
SHOW CREATE DATABASE db1;

修改数据库信息:

ALTER DATABASE 数据库名称 DEFAULT CHARSET=编码格式;

删除数据库(慎用):

DROP DATABASE 数据库名称;

6. 数据表操作

创建数据表:

CREATE TABLE 数据表名称 (
    字段1 字段类型 [字段约束],
    字段2 字段类型 [字段约束],
    ...
);

查询数据表:

-- 选择数据库
USE 数据库名称;

-- 显示所有数据表
SHOW TABLES;

-- 显示表的创建语句
SHOW CREATE TABLE 数据表名称;

-- 显示表结构
DESC 数据表名称;

修改数据表:

Ⅰ. 添加字段:

ALTER TABLE 数据表名称 ADD 新字段 字段类型 FIRST|AFTER 其他字段;
-- FIRST: 将新字段放在第一位
-- AFTER 字段名: 将新字段放在指定字段之后

Ⅱ. 修改字段名称或类型:

ALTER TABLE 表名称 CHANGE 旧字段名 新字段名 字段类型;

Ⅲ. 修改字段类型或约束:

ALTER TABLE 表名称 MODIFY 字段名称 字段类型;

Ⅳ. 删除字段:

ALTER TABLE 表名称 DROP 字段名称;

Ⅴ. 修改表名:

ALTER TABLE 旧表名 RENAME TO 新表名;

Ⅵ. 修改表的字符集:

ALTER TABLE 表名称 DEFAULT CHARSET=编码格式;

删除数据表(慎用):

DROP TABLE 数据表名称;

三、数据类型与运算符

1. 数据类型

整型:

类型占用空间取值范围(有符号)
TINYINT1 字节-128 ~ 127
SMALLINT2 字节-32768 ~ 32767
MEDIUMINT3 字节-8388608 ~ 8388607
INT / INTEGER4 字节-2147483648 ~ 2147483647
BIGINT8 字节±9.22×10¹⁸

浮点与定点数:

类型说明
FLOAT(M,D)单精度浮点数,M 为总位数,D 为小数位
DOUBLE(M,D)双精度浮点数
DECIMAL(M,D)定点数(精确存储),适合金额等对精度敏感的场景

字符串类型:

类型说明最大长度
CHAR(N)定长字符串255 字符
VARCHAR(N)变长字符串65535 字符
TINYTEXT微型文本255 字节
TEXT文本65535 字节
MEDIUMTEXT中型文本16MB
LONGTEXT大型文本4GB
ENUM枚举类型65535 个值
SET集合类型64 个值

日期/时间类型:

类型格式说明
DATEYYYY-MM-DD日期
TIMEHH:MM:SS时间
DATETIMEYYYY-MM-DD HH:MM:SS日期时间
TIMESTAMPYYYY-MM-DD HH:MM:SS时间戳(受时区影响)
YEARYYYY年份

二进制类型:

类型说明
BINARY(N)定长二进制
VARBINARY(N)变长二进制
BLOB二进制大对象

其他类型:

类型说明
JSONMySQL 5.7+ 原生 JSON 支持
GEOMETRY空间数据类型

2. 运算符

算术运算符: +、-、*、/、%(取模)

比较运算符:

运算符说明
=等于
<> / !=不等于
< / <= / > / >=大小比较
BETWEEN … AND …在指定范围之间
IN (值1, 值2, …)在指定集合中
LIKE模糊匹配(% 匹配任意多个字符,_ 匹配单个字符)
IS NULL / IS NOT NULL判断是否为空

逻辑运算符: AND(与)、OR(或)、NOT(非)、XOR(异或)

位运算符: &(位与)、|(位或)、^(位异或)、~(位取反)、>>(右移)、<<(左移)


四、存储引擎

1. 存储引擎概述

MySQL 使用可插拔存储引擎架构,支持多种存储引擎以满足不同场景需求。

2. MyISAM 与 InnoDB 对比

特性MyISAMInnoDB
事务不支持✅ 支持
外键不支持✅ 支持
锁粒度表级锁行级锁 + 表级锁
并发性能低(锁定整张表)高(只锁定涉及的行)
全文索引✅ 支持MySQL 5.6+ 支持
缓存只缓存索引缓存索引 + 数据
默认使用MySQL 5.5 之前MySQL 5.5+ 默认引擎
适用场景以查询为主、不需要事务的表需要事务支持、高并发读写

3. 查看存储引擎

-- 查看当前 MySQL 支持的存储引擎
SHOW ENGINES;

-- 查看表的存储引擎
SHOW CREATE TABLE 表名称;

-- 查看数据库默认存储引擎
SHOW VARIABLES LIKE 'default_storage_engine';

五、索引

1. 索引概述

索引是帮助 MySQL 高效获取数据的数据结构。索引可以大大提高查询速度,但会降低写入性能并占用额外空间。

2. 索引分类

索引类型说明
普通索引(INDEX)最基本的索引,没有唯一性限制
唯一索引(UNIQUE)索引列的值必须唯一,允许 NULL
主键索引(PRIMARY KEY)特殊的唯一索引,不允许 NULL,一个表只能有一个
复合索引多列组合索引,遵循最左前缀原则
全文索引(FULLTEXT)用于全文搜索
空间索引(SPATIAL)用于空间数据类型

3. 索引操作

-- 创建索引
CREATE INDEX 索引名 ON 表名(列名);
CREATE UNIQUE INDEX 索引名 ON 表名(列名);

-- 查看索引
SHOW INDEX FROM 表名;

-- 删除索引
DROP INDEX 索引名 ON 表名;

4. 索引使用原则

  • 最左前缀原则:复合索引从最左侧开始匹配,跳过中间列会导致后续列无法使用索引
  • 高选择性列优先:区分度高的列放在复合索引左侧
  • 避免过度索引:索引不是越多越好,每增加一个索引都会降低写入性能
  • 覆盖索引:查询的列全部在索引中时,无需回表查询,性能极高

六、主从复制

1. MySQL 主从复制概述

MySQL 主从复制(Master-Slave Replication)是指将主数据库(Master)的 DDL 和 DML 操作通过二进制日志(Binlog)传输到从数据库(Slave)上,并在从库上重新执行,从而保持主从数据一致。

2. 主从复制架构

架构模式说明
一主一从一个 Master 同步到一个 Slave
一主多从一个 Master 同步到多个 Slave,分担读压力
主主复制(Master-Master)两个 Master 互相同步,同一时刻只有一台接收写请求
级联复制Slave 同时作为下一级 Slave 的 Master

3. 主从复制核心思路

⚠️ 图片缺失:原文档引用的主从复制架构图为本地临时文件。

配置要点:

  1. Slave 必须安装相同版本的 MySQL 数据库软件
  2. Master 端必须开启二进制日志(Binlog);Slave 端必须开启 Relay Log
  3. Master 端和 Slave 端的 server-id 不能一致
  4. Master 端必须创建复制用户
  5. 保证 Master 和 Slave 初始数据一致

配置步骤:

-- Master 端 my.cnf 配置
[mysqld]
log-bin=mysql-bin
server-id=1

-- Slave 端 my.cnf 配置
[mysqld]
server-id=2
relay-log=mysql-relay-bin
-- Master 端创建复制用户
CREATE USER 'repl'@'%' IDENTIFIED BY '密码';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';

-- Slave 端配置主从
CHANGE MASTER TO
    MASTER_HOST='主库IP',
    MASTER_USER='repl',
    MASTER_PASSWORD='密码',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=位置号;

START SLAVE;

-- 查看从库状态
SHOW SLAVE STATUS\\G;

七、基于 GTID 的复制

1. GTID 概述

GTID(Global Transaction Identifiers)—— 全局事务标识符,是 MySQL 5.6 引入的新特性。

特点:

  • 每个事务都可以被唯一识别和跟踪
  • 添加新 Slave 或 Master 故障切换时,无需指定 Binlog 文件名和 Position 值
  • 完全基于事务,不支持 MyISAM 存储引擎

GTID 组成: source_id:transaction_id

  • source_id:来自 server_uuid,可在 auto.cnf 中查看
  • transaction_id:自动生成的序列数字

使用限制:

  1. ❌ 不支持非事务引擎(MyISAM),可能导致多个 GTID 分配给同一事务
  2. ❌ 不支持 CREATE TABLE … SELECT 语句(主库语法报错)
  3. ❌ 不支持 CREATE/DROP TEMPORARY TABLE 语句
  4. ⚠️ 必须设置 enforce-gtid-consistency 参数
  5. ⚠️ sql-slave-skip-counter 不适用(传统跳过错误方式失效)
  6. ⚠️ GTID 环境中所有节点必须统一开启或关闭 GTID

八、半同步复制

1. 概念

半同步复制(Semi-Synchronous Replication)保证 Master 在每次 COMMIT 事务时,必须等待至少一个 Slave 确认已收到并写入 Relay Log 后,才向客户端返回成功。

Master COMMIT → 发送 Binlog → Slave 接收并写入 Relay Log → Slave 回复 ACK → Master 返回客户端成功

优点: 主从数据一致性更高 缺点: 牺牲 Master 性能(需等待 Slave 确认)

等待超时时间可配置:

sql -- 设置半同步复制等待超时时间(默认 10 秒) SET GLOBAL rpl_semi_sync_master_timeout = 10000;


九、MHA 高可用架构

1. 什么是 MHA

MHA(Master High Availability)是一套成熟的 MySQL 高可用故障切换方案,由日本 DeNA 公司开发。

  • 故障切换时间:0~30 秒内自动完成
  • 数据一致性:在故障切换过程中最大程度保证数据不丢失
  • 适用场景:生产环境高可用需求

2. 工作原理

⚠️ 图片缺失:原文档引用的 MHA 架构图为本地临时文件。

` Master 故障 → 对比 Slave Binlog 位置 → 选取最新 Slave → 生成差异中继日志 → 应用日志 → 提升为新 Master

  1. Master 出现故障
  2. 对比各 Slave 的 I/O 线程读取 Binlog 的位置,选取最接近 Master 的 Slave 作为 Latest Slave
  3. 其他 Slave 与 Latest Slave 对比生成差异中继日志并应用
  4. 在 Latest Slave 上应用从 Master 保存的 Binlog,提升为新的 Master
  5. 其他 Slave 应用差异中继日志并开始从新 Master 复制 `

3. MHA 组件

组件部署位置功能
MHA Manager独立机器或 Slave 节点监控 Master、自动故障切换、管理多个集群
MHA Node所有运行 MySQL 的服务器保存 Binlog、应用差异中继日志、清除中继日志

MHA Node 三大作用:

  1. 保存二进制日志:如果可访问故障 Master,拷贝其 Binlog
  2. 应用差异中继日志:从拥有最新数据的 Slave 生成并应用中继日志
  3. 清除中继日志:在不停止 SQL 线程的情况下安全删除中继日志

关联文档