深入MySQL的组成结构与结构化查询语言详解
目录
-
MySQL整体架构概述 -
MySQL核心组件详解 -
存储引擎体系 -
内存结构深入分析 -
磁盘结构详解 -
SQL语言体系概述 -
DDL数据定义语言 -
DML数据操作语言 -
DQL数据查询语言 -
DCL数据控制语言 -
性能优化与运维实践
MySQL整体架构概述
MySQL作为世界上最流行的开源关系型数据库管理系统,采用了分层架构设计。从整体上看,MySQL主要分为以下几个层次:
1. 连接层(Connection Layer)
连接层负责处理客户端的连接请求,包括:
-
• 连接管理:建立、维护和销毁客户端连接 -
• 身份验证:用户名、密码验证,权限检查 -
• 线程管理:为每个连接分配独立的线程 -
• 连接池管理:复用连接,减少连接开销
2. 服务层(Service Layer)
服务层是MySQL的核心,包含了大多数MySQL功能:
-
• SQL接口:接收SQL语句并返回查询结果 -
• 解析器:词法分析和语法分析 -
• 优化器:查询优化和执行计划生成 -
• 缓存:查询缓存机制 -
• 内置函数:日期、时间、数学、加密等函数
3. 引擎层(Engine Layer)
存储引擎层负责数据的存储和提取:
-
• 可插拔设计:支持多种存储引擎 -
• 事务处理:ACID特性支持 -
• 锁机制:并发控制 -
• 索引管理:B+树、哈希等索引结构
4. 存储层(Storage Layer)
物理存储层负责数据的持久化:
-
• 数据文件:表数据存储 -
• 日志文件:事务日志、错误日志等 -
• 索引文件:索引数据存储 -
• 配置文件:系统配置信息
MySQL核心组件详解
连接器(Connector)
连接器是客户端与MySQL服务器通信的桥梁:
-- 查看当前连接状态
SHOW PROCESSLIST;
-- 查看连接相关参数
SHOW VARIABLES LIKE '%connect%';
-- 设置最大连接数
SET GLOBAL max_connections = 1000;
关键配置参数:
-
• max_connections
:最大连接数 -
• connect_timeout
:连接超时时间 -
• wait_timeout
:空闲连接超时时间 -
• interactive_timeout
:交互式连接超时时间
查询缓存(Query Cache)
查询缓存用于缓存SELECT语句的结果:
-- 查看查询缓存状态
SHOW VARIABLES LIKE 'query_cache%';
-- 查看查询缓存统计信息
SHOW STATUS LIKE 'Qcache%';
-- 清理查询缓存
FLUSH QUERY CACHE;
RESET QUERY CACHE;
注意事项:
-
• MySQL 8.0已移除查询缓存功能 -
• 查询缓存在高并发场景下可能成为性能瓶颈 -
• 适用于读多写少的应用场景
解析器(Parser)
解析器负责SQL语句的词法和语法分析:
词法分析阶段:
-
• 识别SQL关键字、标识符、操作符 -
• 检查语法错误 -
• 生成词法单元序列
语法分析阶段:
-
• 构建抽象语法树(AST) -
• 验证SQL语句的语法正确性 -
• 准备后续优化处理
优化器(Optimizer)
优化器是MySQL的核心组件,负责生成最优执行计划:
-- 查看执行计划
EXPLAIN SELECT*FROM users WHERE age >25;
-- 查看详细执行计划
EXPLAIN FORMAT=JSON SELECT*FROM users WHERE age >25;
-- 查看优化器追踪信息
SET optimizer_trace='enabled=on';
SELECT*FROM users WHERE age >25;
SELECT*FROM information_schema.optimizer_trace;
优化器类型:
-
• 基于规则的优化(RBO):根据预定义规则优化 -
• 基于成本的优化(CBO):根据统计信息估算成本
执行器(Executor)
执行器负责执行优化后的SQL语句:
-- 查看执行统计信息
SHOW STATUS LIKE 'Handler%';
-- 查看慢查询日志
SHOW VARIABLES LIKE 'slow_query_log%';
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;
存储引擎体系
InnoDB存储引擎
InnoDB是MySQL的默认存储引擎,具有以下特点:
事务支持:
-- 查看事务隔离级别
SELECT @@transaction_isolation;
-- 设置事务隔离级别
SET SESSION transaction_isolation ='READ-COMMITTED';
-- 事务操作示例
START TRANSACTION;
UPDATE accounts SET balance = balance -100WHERE id =1;
UPDATE accounts SET balance = balance +100WHERE id =2;
COMMIT;
行级锁定:
-- 查看锁状态
SHOW ENGINE INNODB STATUS;
-- 查看锁等待情况
SELECT * FROM information_schema.innodb_locks;
SELECT * FROM information_schema.innodb_lock_waits;
外键约束:
-- 创建外键约束
CREATE TABLE orders (
id INT PRIMARY KEY,
customer_id INT,
FOREIGN KEY (customer_id) REFERENCES customers(id)
);
-- 查看外键约束
SELECT * FROM information_schema.key_column_usage
WHERE referenced_table_name IS NOT NULL;
MyISAM存储引擎
MyISAM是MySQL早期的默认存储引擎:
特点:
-
• 表级锁定 -
• 不支持事务 -
• 支持全文索引 -
• 存储空间小
-- 创建MyISAM表
CREATE TABLE logs (
id INT PRIMARY KEY,
message TEXT,
created_at TIMESTAMP
) ENGINE=MyISAM;
-- 优化MyISAM表
OPTIMIZE TABLE logs;
-- 修复MyISAM表
REPAIR TABLE logs;
Memory存储引擎
Memory引擎将数据存储在内存中:
-- 创建Memory表
CREATE TABLE sessions (
session_id VARCHAR(32) PRIMARY KEY,
user_id INT,
last_activity TIMESTAMP
) ENGINE=MEMORY;
-- 查看Memory引擎配置
SHOW VARIABLES LIKE 'max_heap_table_size';
其他存储引擎
-
• Archive:用于数据归档 -
• CSV:以CSV格式存储数据 -
• Federated:访问远程MySQL服务器 -
• NDB:用于MySQL Cluster
内存结构深入分析
全局内存区域
1. InnoDB缓冲池(Buffer Pool)
缓冲池是InnoDB最重要的内存结构:
-- 查看缓冲池状态
SHOW ENGINE INNODB STATUS\G
-- 查看缓冲池配置
SHOW VARIABLES LIKE 'innodb_buffer_pool%';
-- 配置缓冲池大小
SET GLOBAL innodb_buffer_pool_size = 1073741824; -- 1GB
缓冲池管理:
-
• LRU链表:最近最少使用算法 -
• Free链表:空闲页面管理 -
• Flush链表:脏页管理
2. 重做日志缓冲(Redo Log Buffer)
-- 查看重做日志缓冲配置
SHOW VARIABLES LIKE 'innodb_log_buffer_size';
-- 设置重做日志缓冲大小
SET GLOBAL innodb_log_buffer_size = 16777216; -- 16MB
3. 额外内存池(Additional Memory Pool)
-- 查看额外内存池配置
SHOW VARIABLES LIKE 'innodb_additional_mem_pool_size';
线程内存区域
1. 排序缓冲区(Sort Buffer)
-- 查看排序缓冲区配置
SHOW VARIABLES LIKE 'sort_buffer_size';
-- 设置排序缓冲区大小
SET SESSION sort_buffer_size = 2097152; -- 2MB
2. 连接缓冲区(Join Buffer)
-- 查看连接缓冲区配置
SHOW VARIABLES LIKE 'join_buffer_size';
-- 设置连接缓冲区大小
SET SESSION join_buffer_size = 262144; -- 256KB
3. 读缓冲区(Read Buffer)
-- 查看读缓冲区配置
SHOW VARIABLES LIKE 'read_buffer_size';
SHOW VARIABLES LIKE 'read_rnd_buffer_size';
磁盘结构详解
系统表空间
系统表空间包含InnoDB数据字典和撤销日志:
-- 查看系统表空间信息
SELECT * FROM information_schema.innodb_sys_tablespaces
WHERE name = 'innodb_system';
-- 查看系统表空间文件
SHOW VARIABLES LIKE 'innodb_data_file_path';
独立表空间
每个InnoDB表都有自己的表空间文件:
-- 启用独立表空间
SHOW VARIABLES LIKE 'innodb_file_per_table';
-- 查看表空间信息
SELECT * FROM information_schema.innodb_sys_tablespaces;
-- 查看表空间文件
SELECT * FROM information_schema.files;
重做日志文件
重做日志用于事务恢复:
-- 查看重做日志配置
SHOW VARIABLES LIKE 'innodb_log%';
-- 重做日志文件位置和大小
SHOW VARIABLES LIKE 'innodb_log_group_home_dir';
SHOW VARIABLES LIKE 'innodb_log_file_size';
SHOW VARIABLES LIKE 'innodb_log_files_in_group';
撤销日志
撤销日志用于事务回滚:
-- 查看撤销日志配置
SHOW VARIABLES LIKE 'innodb_undo%';
-- 查看撤销日志统计
SHOW ENGINE INNODB STATUS\G
二进制日志
二进制日志用于主从复制和数据恢复:
-- 启用二进制日志
SHOW VARIABLES LIKE 'log_bin';
-- 查看二进制日志文件
SHOW BINARY LOGS;
-- 查看二进制日志事件
SHOW BINLOG EVENTS IN 'mysql-bin.000001';
-- 刷新二进制日志
FLUSH BINARY LOGS;
SQL语言体系概述
结构化查询语言(SQL)是操作关系型数据库的标准语言,分为四个主要部分:
SQL语言分类
-
1. DDL(Data Definition Language):数据定义语言 -
2. DML(Data Manipulation Language):数据操作语言 -
3. DQL(Data Query Language):数据查询语言 -
4. DCL(Data Control Language):数据控制语言
SQL标准演进
-
• SQL-86:第一个SQL标准 -
• SQL-89:添加了外连接 -
• SQL-92:添加了新的数据类型和语法 -
• SQL-99:添加了正则表达式和面向对象特性 -
• SQL-2003:添加了XML功能 -
• SQL-2008:添加了MERGE语句和窗口函数
DDL数据定义语言
DDL用于定义和管理数据库对象的结构。
数据库操作
创建数据库
-- 基本创建数据库
CREATE DATABASE mydb;
-- 指定字符集和排序规则
CREATE DATABASE mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 创建数据库时检查是否存在
CREATE DATABASE IF NOT EXISTS mydb;
修改数据库
-- 修改数据库字符集
ALTER DATABASE mydb
CHARACTER SET utf8mb4
COLLATE utf8mb4_unicode_ci;
-- 修改数据库读写权限
ALTER DATABASE mydb READ ONLY = 1;
删除数据库
-- 删除数据库
DROP DATABASE mydb;
-- 安全删除数据库
DROP DATABASE IF EXISTS mydb;
查看数据库
-- 查看所有数据库
SHOW DATABASES;
-- 查看数据库创建语句
SHOW CREATE DATABASE mydb;
-- 查看当前数据库
SELECT DATABASE();
表操作
创建表
-- 基本表创建
CREATE TABLE users (
id INTPRIMARY KEY AUTO_INCREMENT,
username VARCHAR(50) NOT NULLUNIQUE,
email VARCHAR(100) NOT NULL,
password VARCHAR(255) NOT NULL,
created_at TIMESTAMPDEFAULTCURRENT_TIMESTAMP,
updated_at TIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP
);
-- 创建表时指定存储引擎和字符集
CREATE TABLE products (
id INTPRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100) NOT NULL,
price DECIMAL(10,2) NOT NULL,
description TEXT,
category_id INT,
INDEX idx_category (category_id),
FOREIGN KEY (category_id) REFERENCES categories(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 复制表结构
CREATE TABLE users_backup LIKE users;
-- 复制表结构和数据
CREATE TABLE users_backup ASSELECT*FROM users;
修改表结构
-- 添加列
ALTER TABLE users ADDCOLUMN phone VARCHAR(20);
ALTER TABLE users ADDCOLUMN address TEXT AFTER email;
-- 修改列
ALTER TABLE users MODIFY COLUMN phone VARCHAR(30);
ALTER TABLE users CHANGE COLUMN phone mobile VARCHAR(30);
-- 删除列
ALTER TABLE users DROPCOLUMN address;
-- 添加索引
ALTER TABLE users ADD INDEX idx_username (username);
ALTER TABLE users ADDUNIQUE KEY uk_email (email);
-- 删除索引
ALTER TABLE users DROP INDEX idx_username;
-- 添加主键
ALTER TABLE users ADDPRIMARY KEY (id);
-- 删除主键
ALTER TABLE users DROPPRIMARY KEY;
-- 添加外键
ALTER TABLE orders ADD CONSTRAINT fk_customer
FOREIGN KEY (customer_id) REFERENCES customers(id);
-- 删除外键
ALTER TABLE orders DROPFOREIGN KEY fk_customer;
-- 修改表名
ALTER TABLE users RENAME TO user_accounts;
RENAME TABLE users TO user_accounts;
-- 修改表引擎
ALTER TABLE users ENGINE=MyISAM;
-- 修改表字符集
ALTER TABLE users CONVERTTOCHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
删除表
-- 删除表
DROP TABLE users;
-- 安全删除表
DROP TABLE IF EXISTS users;
-- 删除多个表
DROP TABLE users, products, orders;
-- 清空表数据但保留结构
TRUNCATE TABLE users;
查看表信息
-- 查看所有表
SHOW TABLES;
-- 查看表结构
DESCRIBE users;
DESC users;
SHOW COLUMNS FROM users;
-- 查看表创建语句
SHOWCREATE TABLE users;
-- 查看表状态
SHOWTABLE STATUS LIKE'users';
-- 查看表索引
SHOW INDEX FROM users;
索引操作
创建索引
-- 普通索引
CREATE INDEX idx_username ON users(username);
-- 唯一索引
CREATEUNIQUE INDEX uk_email ON users(email);
-- 复合索引
CREATE INDEX idx_name_age ON users(name, age);
-- 前缀索引
CREATE INDEX idx_email_prefix ON users(email(10));
-- 全文索引
CREATE FULLTEXT INDEX ft_content ON articles(content);
-- 空间索引
CREATE SPATIAL INDEX sp_location ON places(location);
删除索引
-- 删除索引
DROP INDEX idx_username ON users;
-- 删除主键索引
ALTER TABLE users DROP PRIMARY KEY;
-- 删除外键索引
ALTER TABLE users DROP FOREIGN KEY fk_constraint_name;
视图操作
创建视图
-- 基本视图
CREATEVIEW user_summary AS
SELECT id, username, email, created_at
FROM users
WHERE status ='active';
-- 复杂视图
CREATEVIEW order_details AS
SELECT
o.id,
o.order_date,
u.username,
p.name AS product_name,
oi.quantity,
oi.price
FROM orders o
JOIN users u ON o.user_id = u.id
JOIN order_items oi ON o.id = oi.order_id
JOIN products p ON oi.product_id = p.id;
-- 可更新视图
CREATEVIEW active_users AS
SELECT id, username, email
FROM users
WHERE status ='active'
WITHCHECK OPTION;
修改视图
-- 修改视图
ALTER VIEW user_summary AS
SELECT id, username, email, created_at, last_login
FROM users
WHERE status = 'active';
-- 或者使用CREATE OR REPLACE
CREATE OR REPLACE VIEW user_summary AS
SELECT id, username, email, created_at, last_login
FROM users
WHERE status = 'active';
删除视图
-- 删除视图
DROP VIEW user_summary;
-- 安全删除视图
DROP VIEW IF EXISTS user_summary;
存储过程和函数
创建存储过程
DELIMITER //
CREATEPROCEDURE GetUserById(IN user_id INT)
BEGIN
SELECT*FROM users WHERE id = user_id;
END//
DELIMITER ;
-- 复杂存储过程
DELIMITER //
CREATEPROCEDURE UpdateUserStatus(
IN p_user_id INT,
IN p_status VARCHAR(20),
OUT p_result VARCHAR(50)
)
BEGIN
DECLARE v_count INTDEFAULT0;
SELECTCOUNT(*) INTO v_count FROM users WHERE id = p_user_id;
IF v_count >0THEN
UPDATE users SET status = p_status WHERE id = p_user_id;
SET p_result ='Success';
ELSE
SET p_result ='User not found';
END IF;
END//
DELIMITER ;
创建函数
DELIMITER //
CREATEFUNCTION GetUserCount() RETURNSINT
READSSQL DATA
DETERMINISTIC
BEGIN
DECLARE user_count INTDEFAULT0;
SELECTCOUNT(*) INTO user_count FROM users;
RETURN user_count;
END//
DELIMITER ;
-- 调用函数
SELECT GetUserCount();
触发器
创建触发器
-- BEFORE INSERT触发器
DELIMITER //
CREATETRIGGER before_user_insert
BEFORE INSERTON users
FOREACHROW
BEGIN
SET NEW.created_at = NOW();
SET NEW.updated_at = NOW();
END//
DELIMITER ;
-- AFTER UPDATE触发器
DELIMITER //
CREATETRIGGER after_user_update
AFTER UPDATEON users
FOREACHROW
BEGIN
INSERT INTO user_audit (user_id, action, old_value, new_value, changed_at)
VALUES (NEW.id, 'UPDATE', OLD.username, NEW.username, NOW());
END//
DELIMITER ;
-- BEFORE DELETE触发器
DELIMITER //
CREATETRIGGER before_user_delete
BEFORE DELETEON users
FOREACHROW
BEGIN
INSERT INTO deleted_users SELECT*FROM users WHERE id = OLD.id;
END//
DELIMITER ;
查看和删除触发器
-- 查看触发器
SHOW TRIGGERS;
-- 删除触发器
DROP TRIGGER before_user_insert;
DML数据操作语言
DML用于对数据库中的数据进行增删改操作。
INSERT语句
基本插入
-- 插入单条记录
INSERT INTO users (username, email, password)
VALUES ('john_doe', 'john@example.com', 'password123');
-- 插入多条记录
INSERT INTO users (username, email, password) VALUES
('alice', 'alice@example.com', 'pass123'),
('bob', 'bob@example.com', 'pass456'),
('charlie', 'charlie@example.com', 'pass789');
-- 插入所有字段
INSERT INTO users VALUES
(NULL, 'david', 'david@example.com', 'pass000', NOW(), NOW());
高级插入
-- 插入并忽略重复记录
INSERT IGNORE INTO users (username, email, password)
VALUES ('john_doe', 'john@example.com', 'password123');
-- 插入或更新(ON DUPLICATE KEY UPDATE)
INSERT INTO users (username, email, password)
VALUES ('john_doe', 'john@example.com', 'new_password')
ON DUPLICATE KEY UPDATE
email =VALUES(email),
password =VALUES(password),
updated_at = NOW();
-- 从其他表插入
INSERT INTO users_backup (username, email, password)
SELECT username, email, password FROM users WHERE created_at >'2024-01-01';
-- 替换插入
REPLACE INTO users (id, username, email, password)
VALUES (1, 'john_doe', 'john@example.com', 'new_password');
UPDATE语句
基本更新
-- 更新单条记录
UPDATE users
SET email ='newemail@example.com', updated_at = NOW()
WHERE id =1;
-- 更新多条记录
UPDATE users
SET status ='inactive'
WHERE last_login <'2024-01-01';
-- 更新所有记录
UPDATE users SET updated_at = NOW();
高级更新
-- 多表更新
UPDATE users u
JOIN orders o ON u.id = o.user_id
SET u.total_orders = u.total_orders +1
WHERE o.order_date >'2024-01-01';
-- 条件更新
UPDATE users
SET status =CASE
WHEN last_login >'2024-06-01'THEN'active'
WHEN last_login >'2024-01-01'THEN'inactive'
ELSE'dormant'
END;
-- 限制更新记录数
UPDATE users
SET status ='processed'
WHERE status ='pending'
ORDERBY created_at
LIMIT 100;
DELETE语句
基本删除
-- 删除单条记录
DELETE FROM users WHERE id = 1;
-- 删除多条记录
DELETE FROM users WHERE status = 'inactive';
-- 删除所有记录
DELETE FROM users;
高级删除
-- 多表删除
DELETE u
FROM users u
JOIN orders o ON u.id = o.user_id
WHERE o.order_date <'2020-01-01';
-- 限制删除记录数
DELETEFROM users
WHERE status ='spam'
ORDERBY created_at
LIMIT 1000;
-- 安全删除(使用事务)
START TRANSACTION;
DELETEFROM users WHERE id =1;
-- 检查结果
SELECT ROW_COUNT();
COMMIT; -- 或 ROLLBACK;
DQL数据查询语言
DQL是SQL中最复杂也是最常用的部分,用于从数据库中检索数据。
基本SELECT语句
简单查询
-- 查询所有字段
SELECT*FROM users;
-- 查询指定字段
SELECT id, username, email FROM users;
-- 使用别名
SELECT
id AS user_id,
username AS login_name,
email AS email_address
FROM users;
-- 去重查询
SELECTDISTINCT status FROM users;
-- 限制结果数量
SELECT*FROM users LIMIT 10;
SELECT*FROM users LIMIT 10, 20; -- 跳过10条,取20条
WHERE条件查询
基本条件
-- 等值查询
SELECT*FROM users WHERE status ='active';
-- 不等值查询
SELECT*FROM users WHERE status !='inactive';
SELECT*FROM users WHERE status <>'inactive';
-- 数值比较
SELECT*FROM users WHERE age >25;
SELECT*FROM users WHERE age BETWEEN18AND65;
-- 模糊查询
SELECT*FROM users WHERE username LIKE'john%';
SELECT*FROM users WHERE email LIKE'%@gmail.com';
-- 空值查询
SELECT*FROM users WHERE last_login ISNULL;
SELECT*FROM users WHERE last_login ISNOT NULL;
-- 列表查询
SELECT*FROM users WHERE status IN ('active', 'pending');
SELECT*FROM users WHERE id NOTIN (1, 2, 3);
复合条件
-- 逻辑AND
SELECT*FROM users
WHERE status ='active'AND age >25;
-- 逻辑OR
SELECT*FROM users
WHERE status ='active'OR status ='pending';
-- 复杂条件组合
SELECT*FROM users
WHERE (status ='active'OR status ='pending')
AND age BETWEEN18AND65
AND email LIKE'%@gmail.com';
排序和分组
ORDER BY排序
-- 升序排序
SELECT*FROM users ORDERBY created_at ASC;
-- 降序排序
SELECT*FROM users ORDERBY created_at DESC;
-- 多字段排序
SELECT*FROM users
ORDERBY status ASC, created_at DESC;
-- 使用表达式排序
SELECT*FROM users
ORDERBYCHAR_LENGTH(username) DESC;
GROUP BY分组
-- 基本分组
SELECT status, COUNT(*) as user_count
FROM users
GROUPBY status;
-- 多字段分组
SELECT status, DATE(created_at) asdate, COUNT(*) as count
FROM users
GROUPBY status, DATE(created_at);
-- 分组后过滤
SELECT status, COUNT(*) as user_count
FROM users
GROUPBY status
HAVINGCOUNT(*) >10;
-- 分组与排序
SELECT status, COUNT(*) as user_count
FROM users
GROUPBY status
ORDERBY user_count DESC;
聚合函数
常用聚合函数
-- 计数
SELECTCOUNT(*) FROM users;
SELECTCOUNT(DISTINCT status) FROM users;
-- 求和
SELECTSUM(order_amount) FROM orders;
-- 平均值
SELECTAVG(age) FROM users;
-- 最大值和最小值
SELECTMAX(created_at), MIN(created_at) FROM users;
-- 字符串连接
SELECT GROUP_CONCAT(username) FROM users;
SELECT GROUP_CONCAT(username SEPARATOR ', ') FROM users;
窗口函数(MySQL 8.0+)
-- 行号
SELECT
username,
email,
ROW_NUMBER() OVER (ORDERBY created_at) as rn
FROM users;
-- 排名
SELECT
username,
age,
RANK() OVER (ORDERBY age DESC) as rank,
DENSE_RANK() OVER (ORDERBY age DESC) as dense_rank
FROM users;
-- 分组排名
SELECT
username,
department,
salary,
RANK() OVER (PARTITIONBY department ORDERBY salary DESC) as dept_rank
FROM employees;
-- 累计求和
SELECT
order_date,
amount,
SUM(amount) OVER (ORDERBY order_date) as running_total
FROM orders;
-- 移动平均
SELECT
order_date,
amount,
AVG(amount) OVER (ORDERBY order_date ROWSBETWEEN2 PRECEDING ANDCURRENTROW) as ma3
FROM orders;
表连接
内连接(INNER JOIN)
-- 基本内连接
SELECT u.username, p.title
FROM users u
INNERJOIN posts p ON u.id = p.user_id;
-- 多表内连接
SELECT
u.username,
p.title,
c.name as category_name
FROM users u
INNERJOIN posts p ON u.id = p.user_id
INNERJOIN categories c ON p.category_id = c.id;
外连接(OUTER JOIN)
-- 左外连接
SELECT u.username, p.title
FROM users u
LEFTJOIN posts p ON u.id = p.user_id;
-- 右外连接
SELECT u.username, p.title
FROM users u
RIGHTJOIN posts p ON u.id = p.user_id;
-- 全外连接(MySQL不直接支持,需要用UNION)
SELECT u.username, p.title
FROM users u
LEFTJOIN posts p ON u.id = p.user_id
UNION
SELECT u.username, p.title
FROM users u
RIGHTJOIN posts p ON u.id = p.user_id;
自连接
-- 查找同部门的员工
SELECT
e1.name as employee,
e2.name as colleague
FROM employees e1
JOIN employees e2 ON e1.department_id = e2.department_id
WHERE e1.id != e2.id;
-- 查找员工及其直接上级
SELECT
e.name as employee,
m.name as manager
FROM employees e
LEFTJOIN employees m ON e.manager_id = m.id;
子查询
标量子查询
-- 查询年龄大于平均年龄的用户
SELECT * FROM users
WHERE age > (SELECT AVG(age) FROM users);
-- 查询最新订单的用户
SELECT * FROM users
WHERE id = (SELECT user_id FROM orders ORDER BY created_at DESC LIMIT 1);
列子查询
-- 查询有订单的用户
SELECT * FROM users
WHERE id IN (SELECT DISTINCT user_id FROM orders);
-- 查询没有订单的用户
SELECT * FROM users
WHERE id NOT IN (SELECT user_id FROM orders WHERE user_id IS NOT NULL);
行子查询
-- 查询特定用户的订单信息
SELECT * FROM orders
WHERE (user_id, order_date) IN (
SELECT user_id, MAX(order_date)
FROM orders
GROUP BY user_id
);
表子查询
-- 使用子查询作为临时表
SELECT user_stats.username, user_stats.order_count
FROM (
SELECT
u.username,
COUNT(o.id) as order_count
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id, u.username
) as user_stats
WHERE user_stats.order_count > 5;
相关子查询
-- 查询每个用户的最新订单
SELECT*FROM orders o1
WHERE o1.created_at = (
SELECTMAX(o2.created_at)
FROM orders o2
WHERE o2.user_id = o1.user_id
);
-- 使用EXISTS
SELECT*FROM users u
WHEREEXISTS (
SELECT1FROM orders o
WHERE o.user_id = u.id AND o.status ='completed'
);
高级查询技巧
公用表表达式(CTE)- MySQL 8.0+
-- 基本CTE
WITH active_users AS (
SELECT id, username, email
FROM users
WHERE status ='active'
)
SELECT*FROM active_users WHERE email LIKE'%@gmail.com';
-- 递归CTE
WITHRECURSIVE employee_hierarchy AS (
-- 基础查询:顶级员工
SELECT id, name, manager_id, 0as level
FROM employees
WHERE manager_id ISNULL
UNIONALL
-- 递归查询:下级员工
SELECT e.id, e.name, e.manager_id, eh.level +1
FROM employees e
JOIN employee_hierarchy eh ON e.manager_id = eh.id
)
SELECT*FROM employee_hierarchy ORDERBY level, name;
案例表达式
-- CASE WHEN
SELECT
username,
age,
CASE
WHEN age <18THEN'未成年'
WHEN age BETWEEN18AND65THEN'成年'
ELSE'老年'
ENDas age_group
FROM users;
-- 简单CASE
SELECT
username,
status,
CASE status
WHEN'active'THEN'活跃'
WHEN'inactive'THEN'不活跃'
ELSE'未知'
ENDas status_desc
FROM users;
DCL数据控制语言
DCL用于控制数据库的访问权限和安全性。
用户管理
创建用户
-- 创建用户
CREATEUSER'newuser'@'localhost' IDENTIFIED BY'password123';
-- 创建用户并指定主机
CREATEUSER'webuser'@'192.168.1.%' IDENTIFIED BY'webpass';
CREATEUSER'appuser'@'%' IDENTIFIED BY'apppass';
-- 创建用户时指定密码策略
CREATEUSER'secureuser'@'localhost'
IDENTIFIED BY'SecurePass123!'
PASSWORD EXPIRE INTERVAL90DAY;
修改用户
-- 修改用户密码
ALTERUSER'newuser'@'localhost' IDENTIFIED BY'newpassword';
-- 修改当前用户密码
ALTERUSERUSER() IDENTIFIED BY'newpassword';
-- 设置密码过期
ALTERUSER'newuser'@'localhost' PASSWORD EXPIRE;
-- 锁定用户
ALTERUSER'newuser'@'localhost' ACCOUNT LOCK;
-- 解锁用户
ALTERUSER'newuser'@'localhost' ACCOUNT UNLOCK;
删除用户
-- 删除用户
DROP USER 'newuser'@'localhost';
-- 删除多个用户
DROP USER 'user1'@'localhost', 'user2'@'localhost';
查看用户
-- 查看所有用户
SELECT user, host FROM mysql.user;
-- 查看当前用户
SELECT USER(), CURRENT_USER();
-- 查看用户权限
SHOW GRANTS FOR 'newuser'@'localhost';
SHOW GRANTS FOR CURRENT_USER();
权限管理
授予权限
-- 授予数据库所有权限
GRANTALL PRIVILEGES ON mydb.*TO'newuser'@'localhost';
-- 授予特定表的权限
GRANTSELECT, INSERT, UPDATEON mydb.users TO'newuser'@'localhost';
-- 授予特定列的权限
GRANTSELECT (id, username), UPDATE (email) ON mydb.users TO'newuser'@'localhost';
-- 授予存储过程权限
GRANTEXECUTEONPROCEDURE mydb.GetUserById TO'newuser'@'localhost';
-- 授予全局权限
GRANT REPLICATION SLAVE ON*.*TO'repl_user'@'%';
-- 授予权限并允许授权给其他用户
GRANTSELECTON mydb.*TO'newuser'@'localhost'WITHGRANT OPTION;
权限类型详解
-- 数据操作权限
GRANTSELECTON mydb.*TO'readonly'@'localhost';
GRANTINSERTON mydb.*TO'insert_user'@'localhost';
GRANTUPDATEON mydb.*TO'update_user'@'localhost';
GRANTDELETEON mydb.*TO'delete_user'@'localhost';
-- 结构操作权限
GRANTCREATEON mydb.*TO'dev_user'@'localhost';
GRANTALTERON mydb.*TO'admin_user'@'localhost';
GRANTDROPON mydb.*TO'admin_user'@'localhost';
GRANT INDEX ON mydb.*TO'dba_user'@'localhost';
-- 管理权限
GRANT PROCESS ON*.*TO'monitor_user'@'localhost';
GRANT RELOAD ON*.*TO'backup_user'@'localhost';
GRANT REPLICATION CLIENT ON*.*TO'repl_monitor'@'localhost';
回收权限
-- 回收特定权限
REVOKESELECTON mydb.users FROM'newuser'@'localhost';
-- 回收所有权限
REVOKEALL PRIVILEGES ON mydb.*FROM'newuser'@'localhost';
-- 回收授权权限
REVOKEGRANT OPTION ON mydb.*FROM'newuser'@'localhost';
刷新权限
-- 刷新权限缓存
FLUSH PRIVILEGES;
角色管理(MySQL 8.0+)
创建角色
-- 创建角色
CREATE ROLE 'app_developer', 'app_read', 'app_write';
-- 授予角色权限
GRANTSELECT, INSERT, UPDATEON mydb.*TO'app_developer';
GRANTSELECTON mydb.*TO'app_read';
GRANTINSERT, UPDATEON mydb.*TO'app_write';
-- 将角色授予用户
GRANT'app_developer'TO'dev_user'@'localhost';
GRANT'app_read'TO'readonly_user'@'localhost';
-- 设置默认角色
SETDEFAULT ROLE 'app_developer'TO'dev_user'@'localhost';
角色继承
-- 创建角色层次结构
CREATE ROLE 'base_role', 'advanced_role', 'admin_role';
-- 基础角色权限
GRANTSELECTON mydb.*TO'base_role';
-- 高级角色继承基础角色
GRANT'base_role'TO'advanced_role';
GRANTINSERT, UPDATEON mydb.*TO'advanced_role';
-- 管理员角色继承高级角色
GRANT'advanced_role'TO'admin_role';
GRANTDELETE, CREATE, ALTERON mydb.*TO'admin_role';
安全配置
密码策略
-- 查看密码策略
SHOW VARIABLES LIKE'validate_password%';
-- 设置密码策略
SETGLOBAL validate_password.policy ='STRONG';
SETGLOBAL validate_password.length =12;
SETGLOBAL validate_password.mixed_case_count =2;
SETGLOBAL validate_password.number_count =2;
SETGLOBAL validate_password.special_char_count =2;
连接限制
-- 创建用户时设置连接限制
CREATEUSER'limited_user'@'localhost'
IDENTIFIED BY'password'
WITH MAX_CONNECTIONS_PER_HOUR 100
MAX_QUERIES_PER_HOUR 1000
MAX_UPDATES_PER_HOUR 100
MAX_USER_CONNECTIONS 5;
-- 修改用户连接限制
ALTERUSER'limited_user'@'localhost'
WITH MAX_CONNECTIONS_PER_HOUR 50;
SSL配置
-- 要求SSL连接
CREATEUSER'secure_user'@'%'
IDENTIFIED BY'password'
REQUIRE SSL;
-- 要求特定的SSL证书
CREATEUSER'cert_user'@'%'
IDENTIFIED BY'password'
REQUIRE X509;
-- 要求特定的SSL密钥
CREATEUSER'key_user'@'%'
IDENTIFIED BY'password'
REQUIRE SUBJECT '/C=US/ST=CA/L=San Francisco/O=MyOrg/CN=MyName';
性能优化与运维实践
查询优化
执行计划分析
-- 基本执行计划
EXPLAIN SELECT*FROM users WHERE age >25;
-- 详细执行计划
EXPLAIN FORMAT=JSON SELECT*FROM users WHERE age >25;
-- 查看实际执行统计
EXPLAIN ANALYZE SELECT*FROM users WHERE age >25;
索引优化策略
-- 创建合适的索引
CREATE INDEX idx_age ON users(age);
CREATE INDEX idx_status_created ON users(status, created_at);
-- 查看索引使用情况
SHOW INDEX FROM users;
-- 分析索引效率
SELECT
table_name,
index_name,
cardinality,
nullable
FROM information_schema.statistics
WHERE table_schema ='mydb';
监控与维护
性能监控
-- 查看慢查询
SHOW VARIABLES LIKE'slow_query_log%';
SHOW STATUS LIKE'Slow_queries';
-- 查看连接状态
SHOW STATUS LIKE'Connections';
SHOW STATUS LIKE'Threads_%';
-- 查看缓存命中率
SHOW STATUS LIKE'Key_read%';
SHOW STATUS LIKE'Innodb_buffer_pool_read%';
-- 查看锁等待
SHOW STATUS LIKE'Innodb_row_lock_%';
表维护
-- 分析表
ANALYZE TABLE users;
-- 优化表
OPTIMIZE TABLE users;
-- 检查表
CHECK TABLE users;
-- 修复表
REPAIR TABLE users;
备份与恢复
逻辑备份
# 备份单个数据库
mysqldump -u root -p mydb > mydb_backup.sql
# 备份所有数据库
mysqldump -u root -p --all-databases > all_databases_backup.sql
# 备份表结构
mysqldump -u root -p --no-data mydb > mydb_structure.sql
# 恢复数据库
mysql -u root -p mydb < mydb_backup.sql
物理备份
-- 创建备份目录
SETGLOBAL local_infile =1;
-- 导出数据到文件
SELECT*INTO OUTFILE '/tmp/users_backup.csv'
FIELDS TERMINATED BY','
LINES TERMINATED BY'\n'
FROM users;
-- 从文件导入数据
LOAD DATA INFILE '/tmp/users_backup.csv'
INTOTABLE users
FIELDS TERMINATED BY','
LINES TERMINATED BY'\n';
主从复制配置
主库配置
-- 启用二进制日志
SETGLOBAL log_bin ='mysql-bin';
-- 创建复制用户
CREATEUSER'repl'@'slave_host' IDENTIFIED BY'repl_password';
GRANT REPLICATION SLAVE ON*.*TO'repl'@'slave_host';
-- 查看主库状态
SHOW MASTER STATUS;
从库配置
-- 配置主库信息
CHANGE MASTER TO
MASTER_HOST='master_host',
MASTER_USER='repl',
MASTER_PASSWORD='repl_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
-- 启动复制
START SLAVE;
-- 查看从库状态
SHOW SLAVE STATUS\G;
总结
本文深入探讨了MySQL的架构组成和SQL语言体系,涵盖了从基础概念到高级应用的各个方面。作为运维工程师,掌握这些知识对于数据库的日常管理、性能优化和故障排除至关重要。
关键要点回顾
-
1. MySQL架构理解:分层架构设计使得MySQL具有良好的扩展性和灵活性 -
2. 存储引擎选择:InnoDB适合事务处理,MyISAM适合读密集型应用 -
3. 内存管理:合理配置缓冲池大小对性能影响巨大 -
4. SQL语言掌握:熟练使用DDL、DML、DQL、DCL是基本技能 -
5. 性能优化:索引设计、查询优化、监控调优是持续过程 -
6. 安全管理:用户权限控制、数据备份恢复是安全保障
运维最佳实践
-
1. 定期监控:建立完善的监控体系,及时发现问题 -
2. 备份策略:制定并执行定期备份计划,确保数据安全 -
3. 性能调优:持续优化查询语句和索引设计 -
4. 安全加固:定期审核用户权限,加强访问控制 -
5. 容量规划:根据业务增长预估资源需求 -
6. 故障预案:制定详细的故障处理流程和恢复方案
通过深入理解MySQL的内部机制和熟练掌握SQL语言,运维工程师能够更好地管理和优化数据库系统,确保业务的稳定运行和数据的安全可靠。随着业务的发展和技术的进步,持续学习和实践是每个运维工程师必须具备的素质。
想了解更多干货,可通过下方扫码关注
可扫码添加上智启元官方客服微信👇