一文彻底搞懂MySQL组成结构及SQL高效查询技巧(附大厂经验)17认证网

正规官方授权
更专业・更权威

一文彻底搞懂MySQL组成结构及SQL高效查询技巧(附大厂经验)

深入MySQL的组成结构与结构化查询语言详解

目录

  1. MySQL整体架构概述
  2. MySQL核心组件详解
  3. 存储引擎体系
  4. 内存结构深入分析
  5.  磁盘结构详解
  6. SQL语言体系概述
  7.  DDL数据定义语言
  8.  DML数据操作语言
  9.  DQL数据查询语言
  10.  DCL数据控制语言
  11.  性能优化与运维实践

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. 1. DDL(Data Definition Language):数据定义语言
  2. 2. DML(Data Manipulation Language):数据操作语言
  3. 3. DQL(Data Query Language):数据查询语言
  4. 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. 1. MySQL架构理解:分层架构设计使得MySQL具有良好的扩展性和灵活性
  2. 2. 存储引擎选择:InnoDB适合事务处理,MyISAM适合读密集型应用
  3. 3. 内存管理:合理配置缓冲池大小对性能影响巨大
  4. 4. SQL语言掌握:熟练使用DDL、DML、DQL、DCL是基本技能
  5. 5. 性能优化:索引设计、查询优化、监控调优是持续过程
  6. 6. 安全管理:用户权限控制、数据备份恢复是安全保障

运维最佳实践

  1. 1. 定期监控:建立完善的监控体系,及时发现问题
  2. 2. 备份策略:制定并执行定期备份计划,确保数据安全
  3. 3. 性能调优:持续优化查询语句和索引设计
  4. 4. 安全加固:定期审核用户权限,加强访问控制
  5. 5. 容量规划:根据业务增长预估资源需求
  6. 6. 故障预案:制定详细的故障处理流程和恢复方案

通过深入理解MySQL的内部机制和熟练掌握SQL语言,运维工程师能够更好地管理和优化数据库系统,确保业务的稳定运行和数据的安全可靠。随着业务的发展和技术的进步,持续学习和实践是每个运维工程师必须具备的素质。

想了解更多干货,可通过下方扫码关注

可扫码添加上智启元官方客服微信👇

未经允许不得转载:17认证网 » 一文彻底搞懂MySQL组成结构及SQL高效查询技巧(附大厂经验)
分享到:0

评论已关闭。

400-663-6632
咨询老师
咨询老师
咨询老师