0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

马哥Linux运维 来源:马哥Linux运维 2025-07-14 11:21 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

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

MySQL整体架构概述

MySQL作为世界上最流行的开源关系型数据库管理系统,采用了分层架构设计。从整体上看,MySQL主要分为以下几个层次:

1. 连接层(Connection Layer)

连接层负责处理客户端的连接请求,包括:

连接管理:建立、维护和销毁客户端连接

身份验证:用户名、密码验证,权限检查

线程管理:为每个连接分配独立的线程

连接池管理:复用连接,减少连接开销

2. 服务层(Service Layer)

服务层是MySQL的核心,包含了大多数MySQL功能:

SQL接口:接收SQL语句并返回查询结果

解析器:词法分析和语法分析

优化器:查询优化和执行计划生成

缓存:查询缓存机制

内置函数:日期、时间、数学、加密等函数

3. 引擎层(Engine Layer)

存储引擎层负责数据的存储和提取:

可插拔设计:支持多种存储引擎

事务处理ACID特性支持

锁机制:并发控制

索引管理:B+树、哈希等索引结构

4. 存储层(Storage Layer)

物理存储层负责数据的持久化:

数据文件:表数据存储

日志文件:事务日志、错误日志等

索引文件:索引数据存储

配置文件:系统配置信息

MySQL核心组件详解

连接器(Connector)

连接器是客户端与MySQL服务器通信的桥梁:

-- 查看当前连接状态
SHOWPROCESSLIST;

-- 查看连接相关参数
SHOWVARIABLESLIKE'%connect%';

-- 设置最大连接数
SETGLOBALmax_connections=1000;

关键配置参数:

•max_connections:最大连接数

•connect_timeout:连接超时时间

•wait_timeout:空闲连接超时时间

•interactive_timeout:交互式连接超时时间

查询缓存(Query Cache)

查询缓存用于缓存SELECT语句的结果:

-- 查看查询缓存状态
SHOWVARIABLESLIKE'query_cache%';

-- 查看查询缓存统计信息
SHOWSTATUSLIKE'Qcache%';

-- 清理查询缓存
FLUSH QUERY CACHE;
RESET QUERY CACHE;

注意事项:

• MySQL 8.0已移除查询缓存功能

• 查询缓存在高并发场景下可能成为性能瓶颈

• 适用于读多写少的应用场景

解析器(Parser)

解析器负责SQL语句的词法和语法分析:

词法分析阶段:

• 识别SQL关键字、标识符、操作符

• 检查语法错误

• 生成词法单元序列

语法分析阶段:

• 构建抽象语法树(AST)

• 验证SQL语句的语法正确性

• 准备后续优化处理

优化器(Optimizer)

优化器是MySQL的核心组件,负责生成最优执行计划:

-- 查看执行计划
EXPLAINSELECT*FROMusersWHEREage>25;

-- 查看详细执行计划
EXPLAIN FORMAT=JSONSELECT*FROMusersWHEREage>25;

-- 查看优化器追踪信息
SEToptimizer_trace='enabled=on';
SELECT*FROMusersWHEREage>25;
SELECT*FROMinformation_schema.optimizer_trace;

优化器类型:

基于规则的优化(RBO):根据预定义规则优化

基于成本的优化(CBO):根据统计信息估算成本

执行器(Executor)

执行器负责执行优化后的SQL语句:

-- 查看执行统计信息
SHOWSTATUSLIKE'Handler%';

-- 查看慢查询日志
SHOWVARIABLESLIKE'slow_query_log%';
SETGLOBALslow_query_log='ON';
SETGLOBALlong_query_time=2;

存储引擎体系

InnoDB存储引擎

InnoDB是MySQL的默认存储引擎,具有以下特点:

事务支持:

-- 查看事务隔离级别
SELECT@@transaction_isolation;

-- 设置事务隔离级别
SETSESSION transaction_isolation='READ-COMMITTED';

-- 事务操作示例
STARTTRANSACTION;
UPDATEaccountsSETbalance=balance-100WHEREid=1;
UPDATEaccountsSETbalance=balance+100WHEREid=2;
COMMIT;

行级锁定:

-- 查看锁状态
SHOWENGINE INNODB STATUS;

-- 查看锁等待情况
SELECT*FROMinformation_schema.innodb_locks;
SELECT*FROMinformation_schema.innodb_lock_waits;

外键约束:

-- 创建外键约束
CREATE TABLEorders (
  idINTPRIMARY KEY,
  customer_idINT,
 FOREIGN KEY(customer_id)REFERENCEScustomers(id)
);

-- 查看外键约束
SELECT*FROMinformation_schema.key_column_usage
WHEREreferenced_table_nameISNOT NULL;

MyISAM存储引擎

MyISAM是MySQL早期的默认存储引擎:

特点:

• 表级锁定

• 不支持事务

• 支持全文索引

• 存储空间小

-- 创建MyISAM表
CREATE TABLElogs (
  idINTPRIMARY KEY,
  message TEXT,
  created_atTIMESTAMP
) ENGINE=MyISAM;

-- 优化MyISAM表
OPTIMIZETABLElogs;

-- 修复MyISAM表
REPAIRTABLElogs;

Memory存储引擎

Memory引擎将数据存储在内存中:

-- 创建Memory表
CREATE TABLEsessions (
  session_idVARCHAR(32)PRIMARY KEY,
  user_idINT,
  last_activityTIMESTAMP
) ENGINE=MEMORY;

-- 查看Memory引擎配置
SHOWVARIABLESLIKE'max_heap_table_size';

其他存储引擎

Archive:用于数据归档

CSV:以CSV格式存储数据

Federated:访问远程MySQL服务器

NDB:用于MySQL Cluster

内存结构深入分析

全局内存区域

1. InnoDB缓冲池(Buffer Pool)

缓冲池是InnoDB最重要的内存结构:

-- 查看缓冲池状态
SHOWENGINE INNODB STATUSG

-- 查看缓冲池配置
SHOWVARIABLESLIKE'innodb_buffer_pool%';

-- 配置缓冲池大小
SETGLOBALinnodb_buffer_pool_size=1073741824;-- 1GB

缓冲池管理:

LRU链表:最近最少使用算法

Free链表:空闲页面管理

Flush链表:脏页管理

2. 重做日志缓冲(Redo Log Buffer)

-- 查看重做日志缓冲配置
SHOWVARIABLESLIKE'innodb_log_buffer_size';

-- 设置重做日志缓冲大小
SETGLOBALinnodb_log_buffer_size=16777216;-- 16MB

3. 额外内存池(Additional Memory Pool)

-- 查看额外内存池配置
SHOWVARIABLESLIKE'innodb_additional_mem_pool_size';

线程内存区域

1. 排序缓冲区(Sort Buffer)

-- 查看排序缓冲区配置
SHOWVARIABLESLIKE'sort_buffer_size';

-- 设置排序缓冲区大小
SETSESSION sort_buffer_size=2097152;-- 2MB

2. 连接缓冲区(Join Buffer)

-- 查看连接缓冲区配置
SHOWVARIABLESLIKE'join_buffer_size';

-- 设置连接缓冲区大小
SETSESSION join_buffer_size=262144;-- 256KB

3. 读缓冲区(Read Buffer)

-- 查看读缓冲区配置
SHOWVARIABLESLIKE'read_buffer_size';
SHOWVARIABLESLIKE'read_rnd_buffer_size';

磁盘结构详解

系统表空间

系统表空间包含InnoDB数据字典和撤销日志:

-- 查看系统表空间信息
SELECT*FROMinformation_schema.innodb_sys_tablespaces
WHEREname='innodb_system';

-- 查看系统表空间文件
SHOWVARIABLESLIKE'innodb_data_file_path';

独立表空间

每个InnoDB表都有自己的表空间文件:

-- 启用独立表空间
SHOWVARIABLESLIKE'innodb_file_per_table';

-- 查看表空间信息
SELECT*FROMinformation_schema.innodb_sys_tablespaces;

-- 查看表空间文件
SELECT*FROMinformation_schema.files;

重做日志文件

重做日志用于事务恢复:

-- 查看重做日志配置
SHOWVARIABLESLIKE'innodb_log%';

-- 重做日志文件位置和大小
SHOWVARIABLESLIKE'innodb_log_group_home_dir';
SHOWVARIABLESLIKE'innodb_log_file_size';
SHOWVARIABLESLIKE'innodb_log_files_in_group';

撤销日志

撤销日志用于事务回滚:

-- 查看撤销日志配置
SHOWVARIABLESLIKE'innodb_undo%';

-- 查看撤销日志统计
SHOWENGINE INNODB STATUSG

二进制日志

二进制日志用于主从复制和数据恢复:

-- 启用二进制日志
SHOWVARIABLESLIKE'log_bin';

-- 查看二进制日志文件
SHOWBINARYLOGS;

-- 查看二进制日志事件
SHOWBINLOG EVENTSIN'mysql-bin.000001';

-- 刷新二进制日志
FLUSHBINARYLOGS;

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用于定义和管理数据库对象的结构。

数据库操作

创建数据库

-- 基本创建数据库
CREATEDATABASE mydb;

-- 指定字符集和排序规则
CREATEDATABASE mydb
CHARACTER SETutf8mb4
COLLATEutf8mb4_unicode_ci;

-- 创建数据库时检查是否存在
CREATEDATABASE IFNOTEXISTSmydb;

修改数据库

-- 修改数据库字符集
ALTERDATABASE mydb
CHARACTER SETutf8mb4
COLLATEutf8mb4_unicode_ci;

-- 修改数据库读写权限
ALTERDATABASE mydb READONLY=1;

删除数据库

-- 删除数据库
DROPDATABASE mydb;

-- 安全删除数据库
DROPDATABASE IFEXISTSmydb;

查看数据库

-- 查看所有数据库
SHOWDATABASES;

-- 查看数据库创建语句
SHOWCREATEDATABASE mydb;

-- 查看当前数据库
SELECTDATABASE();

表操作

创建表

-- 基本表创建
CREATE TABLEusers (
  idINTPRIMARY KEYAUTO_INCREMENT,
  usernameVARCHAR(50)NOT NULLUNIQUE,
  emailVARCHAR(100)NOT NULL,
  passwordVARCHAR(255)NOT NULL,
  created_atTIMESTAMPDEFAULTCURRENT_TIMESTAMP,
  updated_atTIMESTAMPDEFAULTCURRENT_TIMESTAMPONUPDATECURRENT_TIMESTAMP
);

-- 创建表时指定存储引擎和字符集
CREATE TABLEproducts (
  idINTPRIMARY KEYAUTO_INCREMENT,
  nameVARCHAR(100)NOT NULL,
  priceDECIMAL(10,2)NOT NULL,
  description TEXT,
  category_idINT,
  INDEX idx_category (category_id),
 FOREIGN KEY(category_id)REFERENCEScategories(id)
) ENGINE=InnoDBDEFAULTCHARSET=utf8mb4;

-- 复制表结构
CREATE TABLEusers_backupLIKEusers;

-- 复制表结构和数据
CREATE TABLEusers_backupASSELECT*FROMusers;

修改表结构

-- 添加列
ALTER TABLEusersADDCOLUMNphoneVARCHAR(20);
ALTER TABLEusersADDCOLUMNaddress TEXT AFTER email;

-- 修改列
ALTER TABLEusers MODIFYCOLUMNphoneVARCHAR(30);
ALTER TABLEusers CHANGECOLUMNphone mobileVARCHAR(30);

-- 删除列
ALTER TABLEusersDROPCOLUMNaddress;

-- 添加索引
ALTER TABLEusersADDINDEX idx_username (username);
ALTER TABLEusersADDUNIQUEKEY uk_email (email);

-- 删除索引
ALTER TABLEusersDROPINDEX idx_username;

-- 添加主键
ALTER TABLEusersADDPRIMARY KEY(id);

-- 删除主键
ALTER TABLEusersDROPPRIMARY KEY;

-- 添加外键
ALTER TABLEordersADD CONSTRAINTfk_customer
FOREIGN KEY(customer_id)REFERENCEScustomers(id);

-- 删除外键
ALTER TABLEordersDROPFOREIGN KEYfk_customer;

-- 修改表名
ALTER TABLEusers RENAMETOuser_accounts;
RENAMETABLEusersTOuser_accounts;

-- 修改表引擎
ALTER TABLEusers ENGINE=MyISAM;

-- 修改表字符集
ALTER TABLEusersCONVERTTOCHARACTER SETutf8mb4COLLATEutf8mb4_unicode_ci;

删除表

-- 删除表
DROPTABLEusers;

-- 安全删除表
DROPTABLEIFEXISTSusers;

-- 删除多个表
DROPTABLEusers, products, orders;

-- 清空表数据但保留结构
TRUNCATETABLEusers;

查看表信息

-- 查看所有表
SHOWTABLES;

-- 查看表结构
DESCRIBEusers;
DESCusers;
SHOWCOLUMNSFROMusers;

-- 查看表创建语句
SHOWCREATE TABLEusers;

-- 查看表状态
SHOWTABLESTATUSLIKE'users';

-- 查看表索引
SHOWINDEXFROMusers;

索引操作

创建索引

-- 普通索引
CREATEINDEX idx_usernameONusers(username);

-- 唯一索引
CREATEUNIQUEINDEX uk_emailONusers(email);

-- 复合索引
CREATEINDEX idx_name_ageONusers(name, age);

-- 前缀索引
CREATEINDEX idx_email_prefixONusers(email(10));

-- 全文索引
CREATEFULLTEXT INDEX ft_contentONarticles(content);

-- 空间索引
CREATESPATIAL INDEX sp_locationONplaces(location);

删除索引

-- 删除索引
DROPINDEX idx_usernameONusers;

-- 删除主键索引
ALTER TABLEusersDROPPRIMARY KEY;

-- 删除外键索引
ALTER TABLEusersDROPFOREIGN KEYfk_constraint_name;

视图操作

创建视图

-- 基本视图
CREATEVIEWuser_summaryAS
SELECTid, username, email, created_at
FROMusers
WHEREstatus='active';

-- 复杂视图
CREATEVIEWorder_detailsAS
SELECT
  o.id,
  o.order_date,
  u.username,
  p.nameASproduct_name,
  oi.quantity,
  oi.price
FROMorders o
JOINusers uONo.user_id=u.id
JOINorder_items oiONo.id=oi.order_id
JOINproducts pONoi.product_id=p.id;

-- 可更新视图
CREATEVIEWactive_usersAS
SELECTid, username, email
FROMusers
WHEREstatus='active'
WITHCHECKOPTION;

修改视图

-- 修改视图
ALTERVIEWuser_summaryAS
SELECTid, username, email, created_at, last_login
FROMusers
WHEREstatus='active';

-- 或者使用CREATE OR REPLACE
CREATEORREPLACEVIEWuser_summaryAS
SELECTid, username, email, created_at, last_login
FROMusers
WHEREstatus='active';

删除视图

-- 删除视图
DROPVIEWuser_summary;

-- 安全删除视图
DROPVIEWIFEXISTSuser_summary;

存储过程和函数

创建存储过程

DELIMITER//
CREATEPROCEDUREGetUserById(INuser_idINT)
BEGIN
 SELECT*FROMusersWHEREid=user_id;
END//
DELIMITER ;

-- 复杂存储过程
DELIMITER//
CREATEPROCEDUREUpdateUserStatus(
 INp_user_idINT,
 INp_statusVARCHAR(20),
 OUTp_resultVARCHAR(50)
)
BEGIN
 DECLAREv_countINTDEFAULT0;
 
 SELECTCOUNT(*)INTOv_countFROMusersWHEREid=p_user_id;
 
  IF v_count>0THEN
   UPDATEusersSETstatus=p_statusWHEREid=p_user_id;
   SETp_result='Success';
 ELSE
   SETp_result='User not found';
 ENDIF;
END//
DELIMITER ;

创建函数

DELIMITER//
CREATEFUNCTIONGetUserCount()RETURNSINT
READSSQLDATA
DETERMINISTIC
BEGIN
 DECLAREuser_countINTDEFAULT0;
 SELECTCOUNT(*)INTOuser_countFROMusers;
 RETURNuser_count;
END//
DELIMITER ;

-- 调用函数
SELECTGetUserCount();

触发器

创建触发器

-- BEFORE INSERT触发器
DELIMITER//
CREATETRIGGERbefore_user_insert
BEFOREINSERTONusers
FOREACHROW
BEGIN
 SETNEW.created_at=NOW();
 SETNEW.updated_at=NOW();
END//
DELIMITER ;

-- AFTER UPDATE触发器
DELIMITER//
CREATETRIGGERafter_user_update
AFTERUPDATEONusers
FOREACHROW
BEGIN
 INSERT INTOuser_audit (user_id, action, old_value, new_value, changed_at)
 VALUES(NEW.id,'UPDATE', OLD.username, NEW.username, NOW());
END//
DELIMITER ;

-- BEFORE DELETE触发器
DELIMITER//
CREATETRIGGERbefore_user_delete
BEFOREDELETEONusers
FOREACHROW
BEGIN
 INSERT INTOdeleted_usersSELECT*FROMusersWHEREid=OLD.id;
END//
DELIMITER ;

查看和删除触发器

-- 查看触发器
SHOWTRIGGERS;

-- 删除触发器
DROPTRIGGERbefore_user_insert;

DML数据操作语言

DML用于对数据库中的数据进行增删改操作。

INSERT语句

基本插入

-- 插入单条记录
INSERT INTOusers (username, email, password)
VALUES('john_doe','john@example.com','password123');

-- 插入多条记录
INSERT INTOusers (username, email, password)VALUES
('alice','alice@example.com','pass123'),
('bob','bob@example.com','pass456'),
('charlie','charlie@example.com','pass789');

-- 插入所有字段
INSERT INTOusersVALUES
(NULL,'david','david@example.com','pass000', NOW(), NOW());

高级插入

-- 插入并忽略重复记录
INSERTIGNOREINTOusers (username, email, password)
VALUES('john_doe','john@example.com','password123');

-- 插入或更新(ON DUPLICATE KEY UPDATE)
INSERT INTOusers (username, email, password)
VALUES('john_doe','john@example.com','new_password')
ONDUPLICATE KEYUPDATE
  email=VALUES(email),
  password=VALUES(password),
  updated_at=NOW();

-- 从其他表插入
INSERT INTOusers_backup (username, email, password)
SELECTusername, email, passwordFROMusersWHEREcreated_at>'2024-01-01';

-- 替换插入
REPLACEINTOusers (id, username, email, password)
VALUES(1,'john_doe','john@example.com','new_password');

UPDATE语句

基本更新

-- 更新单条记录
UPDATEusers
SETemail='newemail@example.com', updated_at=NOW()
WHEREid=1;

-- 更新多条记录
UPDATEusers
SETstatus='inactive'
WHERElast_login<'2024-01-01';

-- 更新所有记录
UPDATE users SET updated_at = NOW();

高级更新

-- 多表更新
UPDATEusers u
JOINorders oONu.id=o.user_id
SETu.total_orders=u.total_orders+1
WHEREo.order_date>'2024-01-01';

-- 条件更新
UPDATEusers
SETstatus=CASE
 WHENlast_login>'2024-06-01'THEN'active'
 WHENlast_login>'2024-01-01'THEN'inactive'
 ELSE'dormant'
END;

-- 限制更新记录数
UPDATEusers
SETstatus='processed'
WHEREstatus='pending'
ORDERBYcreated_at
LIMIT100;

DELETE语句

基本删除

-- 删除单条记录
DELETEFROMusersWHEREid=1;

-- 删除多条记录
DELETEFROMusersWHEREstatus='inactive';

-- 删除所有记录
DELETEFROMusers;

高级删除

-- 多表删除
DELETEu
FROMusers u
JOINorders oONu.id=o.user_id
WHEREo.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*FROMusers;

-- 查询指定字段
SELECTid, username, emailFROMusers;

-- 使用别名
SELECT
  idASuser_id,
  usernameASlogin_name,
  emailASemail_address
FROMusers;

-- 去重查询
SELECTDISTINCTstatusFROMusers;

-- 限制结果数量
SELECT*FROMusers LIMIT10;
SELECT*FROMusers LIMIT10,20;-- 跳过10条,取20条

WHERE条件查询

基本条件

-- 等值查询
SELECT*FROMusersWHEREstatus='active';

-- 不等值查询
SELECT*FROMusersWHEREstatus!='inactive';
SELECT*FROMusersWHEREstatus<>'inactive';

-- 数值比较
SELECT*FROMusersWHEREage>25;
SELECT*FROMusersWHEREageBETWEEN18AND65;

-- 模糊查询
SELECT*FROMusersWHEREusernameLIKE'john%';
SELECT*FROMusersWHEREemailLIKE'%@gmail.com';

-- 空值查询
SELECT*FROMusersWHERElast_loginISNULL;
SELECT*FROMusersWHERElast_loginISNOT NULL;

-- 列表查询
SELECT*FROMusersWHEREstatusIN('active','pending');
SELECT*FROMusersWHEREidNOTIN(1,2,3);

复合条件

-- 逻辑AND
SELECT*FROMusers
WHEREstatus='active'ANDage>25;

-- 逻辑OR
SELECT*FROMusers
WHEREstatus='active'ORstatus='pending';

-- 复杂条件组合
SELECT*FROMusers
WHERE(status='active'ORstatus='pending')
ANDageBETWEEN18AND65
ANDemailLIKE'%@gmail.com';

排序和分组

ORDER BY排序

-- 升序排序
SELECT*FROMusersORDERBYcreated_atASC;

-- 降序排序
SELECT*FROMusersORDERBYcreated_atDESC;

-- 多字段排序
SELECT*FROMusers
ORDERBYstatusASC, created_atDESC;

-- 使用表达式排序
SELECT*FROMusers
ORDERBYCHAR_LENGTH(username)DESC;

GROUP BY分组

-- 基本分组
SELECTstatus,COUNT(*)asuser_count
FROMusers
GROUPBYstatus;

-- 多字段分组
SELECTstatus,DATE(created_at)asdate,COUNT(*)ascount
FROMusers
GROUPBYstatus,DATE(created_at);

-- 分组后过滤
SELECTstatus,COUNT(*)asuser_count
FROMusers
GROUPBYstatus
HAVINGCOUNT(*)>10;

-- 分组与排序
SELECTstatus,COUNT(*)asuser_count
FROMusers
GROUPBYstatus
ORDERBYuser_countDESC;

聚合函数

常用聚合函数

-- 计数
SELECTCOUNT(*)FROMusers;
SELECTCOUNT(DISTINCTstatus)FROMusers;

-- 求和
SELECTSUM(order_amount)FROMorders;

-- 平均值
SELECTAVG(age)FROMusers;

-- 最大值和最小值
SELECTMAX(created_at),MIN(created_at)FROMusers;

-- 字符串连接
SELECTGROUP_CONCAT(username)FROMusers;
SELECTGROUP_CONCAT(username SEPARATOR', ')FROMusers;

窗口函数(MySQL 8.0+)

-- 行号
SELECT
  username,
  email,
 ROW_NUMBER()OVER(ORDERBYcreated_at)asrn
FROMusers;

-- 排名
SELECT
  username,
  age,
 RANK()OVER(ORDERBYageDESC)asrank,
 DENSE_RANK()OVER(ORDERBYageDESC)asdense_rank
FROMusers;

-- 分组排名
SELECT
  username,
  department,
  salary,
 RANK()OVER(PARTITIONBYdepartmentORDERBYsalaryDESC)asdept_rank
FROMemployees;

-- 累计求和
SELECT
  order_date,
  amount,
 SUM(amount)OVER(ORDERBYorder_date)asrunning_total
FROMorders;

-- 移动平均
SELECT
  order_date,
  amount,
 AVG(amount)OVER(ORDERBYorder_dateROWSBETWEEN2PRECEDINGANDCURRENTROW)asma3
FROMorders;

表连接

内连接(INNER JOIN)

-- 基本内连接
SELECTu.username, p.title
FROMusers u
INNERJOINposts pONu.id=p.user_id;

-- 多表内连接
SELECT
  u.username,
  p.title,
  c.nameascategory_name
FROMusers u
INNERJOINposts pONu.id=p.user_id
INNERJOINcategories cONp.category_id=c.id;

外连接(OUTER JOIN)

-- 左外连接
SELECTu.username, p.title
FROMusers u
LEFTJOINposts pONu.id=p.user_id;

-- 右外连接
SELECTu.username, p.title
FROMusers u
RIGHTJOINposts pONu.id=p.user_id;

-- 全外连接(MySQL不直接支持,需要用UNION)
SELECTu.username, p.title
FROMusers u
LEFTJOINposts pONu.id=p.user_id
UNION
SELECTu.username, p.title
FROMusers u
RIGHTJOINposts pONu.id=p.user_id;

自连接

-- 查找同部门的员工
SELECT
  e1.nameasemployee,
  e2.nameascolleague
FROMemployees e1
JOINemployees e2ONe1.department_id=e2.department_id
WHEREe1.id!=e2.id;

-- 查找员工及其直接上级
SELECT
  e.nameasemployee,
  m.nameasmanager
FROMemployees e
LEFTJOINemployees mONe.manager_id=m.id;

子查询

标量子查询

-- 查询年龄大于平均年龄的用户
SELECT*FROMusers
WHEREage>(SELECTAVG(age)FROMusers);

-- 查询最新订单的用户
SELECT*FROMusers
WHEREid=(SELECTuser_idFROMordersORDERBYcreated_atDESCLIMIT1);

列子查询

-- 查询有订单的用户
SELECT*FROMusers
WHEREidIN(SELECTDISTINCTuser_idFROMorders);

-- 查询没有订单的用户
SELECT*FROMusers
WHEREidNOTIN(SELECTuser_idFROMordersWHEREuser_idISNOT NULL);

行子查询

-- 查询特定用户的订单信息
SELECT*FROMorders
WHERE(user_id, order_date)IN(
 SELECTuser_id,MAX(order_date)
 FROMorders
 GROUPBYuser_id
);

表子查询

-- 使用子查询作为临时表
SELECTuser_stats.username, user_stats.order_count
FROM(
 SELECT
    u.username,
   COUNT(o.id)asorder_count
 FROMusers u
 LEFTJOINorders oONu.id=o.user_id
 GROUPBYu.id, u.username
)asuser_stats
WHEREuser_stats.order_count>5;

相关子查询

-- 查询每个用户的最新订单
SELECT*FROMorders o1
WHEREo1.created_at=(
 SELECTMAX(o2.created_at)
 FROMorders o2
 WHEREo2.user_id=o1.user_id
);

-- 使用EXISTS
SELECT*FROMusers u
WHEREEXISTS(
 SELECT1FROMorders o
 WHEREo.user_id=u.idANDo.status='completed'
);

高级查询技巧

公用表表达式(CTE)- MySQL 8.0+

-- 基本CTE
WITHactive_usersAS(
 SELECTid, username, email
 FROMusers
 WHEREstatus='active'
)
SELECT*FROMactive_usersWHEREemailLIKE'%@gmail.com';

-- 递归CTE
WITHRECURSIVEemployee_hierarchyAS(
 -- 基础查询:顶级员工
 SELECTid, name, manager_id,0aslevel
 FROMemployees
 WHEREmanager_idISNULL
 
 UNIONALL
 
 -- 递归查询:下级员工
 SELECTe.id, e.name, e.manager_id, eh.level+1
 FROMemployees e
 JOINemployee_hierarchy ehONe.manager_id=eh.id
)
SELECT*FROMemployee_hierarchyORDERBYlevel, name;

案例表达式

-- CASE WHEN
SELECT
  username,
  age,
 CASE
   WHENage<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'IDENTIFIEDBY'password123';

-- 创建用户并指定主机
CREATEUSER'webuser'@'192.168.1.%'IDENTIFIEDBY'webpass';
CREATEUSER'appuser'@'%'IDENTIFIEDBY'apppass';

-- 创建用户时指定密码策略
CREATEUSER'secureuser'@'localhost'
IDENTIFIEDBY'SecurePass123!'
PASSWORD EXPIREINTERVAL90DAY;

修改用户

-- 修改用户密码
ALTERUSER'newuser'@'localhost'IDENTIFIEDBY'newpassword';

-- 修改当前用户密码
ALTERUSERUSER() IDENTIFIEDBY'newpassword';

-- 设置密码过期
ALTERUSER'newuser'@'localhost'PASSWORD EXPIRE;

-- 锁定用户
ALTERUSER'newuser'@'localhost'ACCOUNT LOCK;

-- 解锁用户
ALTERUSER'newuser'@'localhost'ACCOUNT UNLOCK;

删除用户

-- 删除用户
DROPUSER'newuser'@'localhost';

-- 删除多个用户
DROPUSER'user1'@'localhost','user2'@'localhost';

查看用户

-- 查看所有用户
SELECTuser, hostFROMmysql.user;

-- 查看当前用户
SELECTUSER(),CURRENT_USER();

-- 查看用户权限
SHOWGRANTSFOR'newuser'@'localhost';
SHOWGRANTSFORCURRENT_USER();

权限管理

授予权限

-- 授予数据库所有权限
GRANTALLPRIVILEGESONmydb.*TO'newuser'@'localhost';

-- 授予特定表的权限
GRANTSELECT,INSERT,UPDATEONmydb.usersTO'newuser'@'localhost';

-- 授予特定列的权限
GRANTSELECT(id, username),UPDATE(email)ONmydb.usersTO'newuser'@'localhost';

-- 授予存储过程权限
GRANTEXECUTEONPROCEDUREmydb.GetUserByIdTO'newuser'@'localhost';

-- 授予全局权限
GRANTREPLICATION SLAVEON*.*TO'repl_user'@'%';

-- 授予权限并允许授权给其他用户
GRANTSELECTONmydb.*TO'newuser'@'localhost'WITHGRANTOPTION;

权限类型详解

-- 数据操作权限
GRANTSELECTONmydb.*TO'readonly'@'localhost';
GRANTINSERTONmydb.*TO'insert_user'@'localhost';
GRANTUPDATEONmydb.*TO'update_user'@'localhost';
GRANTDELETEONmydb.*TO'delete_user'@'localhost';

-- 结构操作权限
GRANTCREATEONmydb.*TO'dev_user'@'localhost';
GRANTALTERONmydb.*TO'admin_user'@'localhost';
GRANTDROPONmydb.*TO'admin_user'@'localhost';
GRANTINDEXONmydb.*TO'dba_user'@'localhost';

-- 管理权限
GRANTPROCESSON*.*TO'monitor_user'@'localhost';
GRANTRELOADON*.*TO'backup_user'@'localhost';
GRANTREPLICATION CLIENTON*.*TO'repl_monitor'@'localhost';

回收权限

-- 回收特定权限
REVOKESELECTONmydb.usersFROM'newuser'@'localhost';

-- 回收所有权限
REVOKEALLPRIVILEGESONmydb.*FROM'newuser'@'localhost';

-- 回收授权权限
REVOKEGRANTOPTIONONmydb.*FROM'newuser'@'localhost';

刷新权限

-- 刷新权限缓存
FLUSH PRIVILEGES;

角色管理(MySQL 8.0+)

创建角色

-- 创建角色
CREATEROLE'app_developer','app_read','app_write';

-- 授予角色权限
GRANTSELECT,INSERT,UPDATEONmydb.*TO'app_developer';
GRANTSELECTONmydb.*TO'app_read';
GRANTINSERT,UPDATEONmydb.*TO'app_write';

-- 将角色授予用户
GRANT'app_developer'TO'dev_user'@'localhost';
GRANT'app_read'TO'readonly_user'@'localhost';

-- 设置默认角色
SETDEFAULTROLE'app_developer'TO'dev_user'@'localhost';

角色继承

-- 创建角色层次结构
CREATEROLE'base_role','advanced_role','admin_role';

-- 基础角色权限
GRANTSELECTONmydb.*TO'base_role';

-- 高级角色继承基础角色
GRANT'base_role'TO'advanced_role';
GRANTINSERT,UPDATEONmydb.*TO'advanced_role';

-- 管理员角色继承高级角色
GRANT'advanced_role'TO'admin_role';
GRANTDELETE,CREATE,ALTERONmydb.*TO'admin_role';

安全配置

密码策略

-- 查看密码策略
SHOWVARIABLESLIKE'validate_password%';

-- 设置密码策略
SETGLOBALvalidate_password.policy='STRONG';
SETGLOBALvalidate_password.length=12;
SETGLOBALvalidate_password.mixed_case_count=2;
SETGLOBALvalidate_password.number_count=2;
SETGLOBALvalidate_password.special_char_count=2;

连接限制

-- 创建用户时设置连接限制
CREATEUSER'limited_user'@'localhost'
IDENTIFIEDBY'password'
WITHMAX_CONNECTIONS_PER_HOUR100
MAX_QUERIES_PER_HOUR1000
MAX_UPDATES_PER_HOUR100
MAX_USER_CONNECTIONS5;

-- 修改用户连接限制
ALTERUSER'limited_user'@'localhost'
WITHMAX_CONNECTIONS_PER_HOUR50;

SSL配置

-- 要求SSL连接
CREATEUSER'secure_user'@'%'
IDENTIFIEDBY'password'
REQUIRE SSL;

-- 要求特定的SSL证书
CREATEUSER'cert_user'@'%'
IDENTIFIEDBY'password'
REQUIRE X509;

-- 要求特定的SSL密钥
CREATEUSER'key_user'@'%'
IDENTIFIEDBY'password'
REQUIRE SUBJECT'/C=US/ST=CA/L=San Francisco/O=MyOrg/CN=MyName';

性能优化与运维实践

查询优化

执行计划分析

-- 基本执行计划
EXPLAINSELECT*FROMusersWHEREage>25;

-- 详细执行计划
EXPLAIN FORMAT=JSONSELECT*FROMusersWHEREage>25;

-- 查看实际执行统计
EXPLAIN ANALYZESELECT*FROMusersWHEREage>25;

索引优化策略

-- 创建合适的索引
CREATEINDEX idx_ageONusers(age);
CREATEINDEX idx_status_createdONusers(status, created_at);

-- 查看索引使用情况
SHOWINDEXFROMusers;

-- 分析索引效率
SELECT
  table_name,
  index_name,
 cardinality,
  nullable
FROMinformation_schema.statistics
WHEREtable_schema='mydb';

监控与维护

性能监控

-- 查看慢查询
SHOWVARIABLESLIKE'slow_query_log%';
SHOWSTATUSLIKE'Slow_queries';

-- 查看连接状态
SHOWSTATUSLIKE'Connections';
SHOWSTATUSLIKE'Threads_%';

-- 查看缓存命中率
SHOWSTATUSLIKE'Key_read%';
SHOWSTATUSLIKE'Innodb_buffer_pool_read%';

-- 查看锁等待
SHOWSTATUSLIKE'Innodb_row_lock_%';

表维护

-- 分析表
ANALYZETABLEusers;

-- 优化表
OPTIMIZETABLEusers;

-- 检查表
CHECKTABLEusers;

-- 修复表
REPAIRTABLEusers;

备份与恢复

逻辑备份

# 备份单个数据库
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

物理备份

-- 创建备份目录
SETGLOBALlocal_infile=1;

-- 导出数据到文件
SELECT*INTOOUTFILE'/tmp/users_backup.csv'
FIELDS TERMINATEDBY','
LINES TERMINATEDBY'
'
FROMusers;

-- 从文件导入数据
LOAD DATA INFILE'/tmp/users_backup.csv'
INTOTABLEusers
FIELDS TERMINATEDBY','
LINES TERMINATEDBY'
';

主从复制配置

主库配置

-- 启用二进制日志
SETGLOBALlog_bin='mysql-bin';

-- 创建复制用户
CREATEUSER'repl'@'slave_host'IDENTIFIEDBY'repl_password';
GRANTREPLICATION SLAVEON*.*TO'repl'@'slave_host';

-- 查看主库状态
SHOWMASTER STATUS;

从库配置

-- 配置主库信息
CHANGE MASTERTO
  MASTER_HOST='master_host',
  MASTER_USER='repl',
  MASTER_PASSWORD='repl_password',
  MASTER_LOG_FILE='mysql-bin.000001',
  MASTER_LOG_POS=154;

-- 启动复制
STARTSLAVE;

-- 查看从库状态
SHOWSLAVE STATUSG;

总结

本文深入探讨了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语言,运维工程师能够更好地管理和优化数据库系统,确保业务的稳定运行和数据的安全可靠。随着业务的发展和技术的进步,持续学习和实践是每个运维工程师必须具备的素质。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 数据库
    +关注

    关注

    7

    文章

    3993

    浏览量

    67755
  • 管理系统
    +关注

    关注

    1

    文章

    2889

    浏览量

    38335
  • MySQL
    +关注

    关注

    1

    文章

    897

    浏览量

    29242

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

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    结构化布线系统有哪些难题

      在布线系统中,结构化布线也是非常重要的一环,这里本文给大家主要讲解了结构化布线系统的规划、安装以及投资成本等问题,希望对您有所帮助。  结构化布线系统规划  大多数电缆厂商为它们的产品规定了15
    发表于 05-19 13:46

    TrustZone结构化消息是什么?

    大家好,我已阅读任何与TrustZone相关的内容,但我无法弄清楚这两个世界是如何相互沟通的。我所能找到的只是TrustZone API规范中的内容:客户端和服务可以通过两种机制进行通信:结构化
    发表于 03-20 08:58

    Deeplearningai结构化机器学习项目

    Deeplearningai 结构化机器学习项目 Week2 6-10
    发表于 05-18 15:12

    结构化汇编语言的监控程序设计思想

    微型计算机控制技术_第五章第5章 常用应用程序设计 本章以51单片机为基础,主要介绍结构化汇编语言的监控程序设计思想和实时测控系统中最常用的数字滤波技术、标度变换、插值算法以及报警程序设计等。 程序
    发表于 09-10 06:50

    结构化设计分为哪几部分?结构化设计的要求有哪些

    结构化设计分为哪几部分?结构化设计的要求有哪些?结构化设计主要包括哪些部分?
    发表于 12-23 06:15

    结构化布线的综合说明

    结构化布线的综合说明 一、结构化布线系统简介     随着计算机和通信技术的飞速发展,网络应用
    发表于 04-14 17:16 850次阅读

    什么叫结构化的算法_算法和结构化数据初识

    结构化算法是由一些基本结构顺序组成的,就是把一个大的功能的实现分隔为许多个小功能的实现。在基本结构之间不存在向前或向后的跳转,流程的转移只存在于一个基本的
    发表于 01-03 16:09 1.3w次阅读
    什么叫<b class='flag-5'>结构化</b>的算法_算法和<b class='flag-5'>结构化</b>数据初识

    结构化布线系统的四点注意事项

    布线系统结构化 结构化布线 title=结构化布线结构化布线 title=结构化布线结构化布线系
    发表于 10-16 10:52 1466次阅读

    Visual FoxPro程序设计教程之结构化查询语言SQL的详细资料合集

    本文档的详细介绍的是Visual FoxPro程序设计教程之结构化查询语言SQL的详细资料合集主要内容包括了:1 SQL语言概述,2 SQL的定义功能,3 SQL的
    发表于 03-04 16:21 3次下载
    Visual FoxPro程序设计教程之<b class='flag-5'>结构化</b><b class='flag-5'>查询</b><b class='flag-5'>语言</b>SQL的详细资料合集

    结构化查询语言SQL的使用详解

    本章讲授结构化査询语言SQL,它是关系数据库的标准语言,具有强大的功能。在它的四大功能中,重点介绍数据查询功能。
    发表于 07-06 17:08 0次下载
    <b class='flag-5'>结构化</b><b class='flag-5'>查询</b><b class='flag-5'>语言</b>SQL的使用<b class='flag-5'>详解</b>

    结构化文本语言ST编程的学习课件

    文本呢?“结构”是指高水平的结构化编程能力,象一个“结构化的编程”;“文本”是指应用文本而不是梯形图和顺序函功能表的能力。ST语言不能代替其它的语言
    发表于 12-28 08:00 20次下载
    <b class='flag-5'>结构化</b>文本<b class='flag-5'>语言</b>ST编程的学习课件

    汇编语言结构化设计程序教程

    汇编语言结构化设计程序教程说明。
    发表于 03-26 09:38 24次下载

    C语言程序设计第四讲结构化程序设计之选择

    C语言程序设计第四讲结构化程序设计之选择
    发表于 12-22 10:34 0次下载

    西门子博途S7-SCL结构化控制语言编程

    最近几年结构化文本编程已经越来越盛行,使用结构化文本语言编程的人数已经超过了使用梯形图编程的人数,大量的PLC工程师从中受益。
    发表于 06-11 11:05 1435次阅读
    西门子博途S7-SCL<b class='flag-5'>结构化</b>控制<b class='flag-5'>语言</b>编程

    结构化布线的好处多吗

    结构化布线是网络系统中的重要组成部分,因为它为数据传输提供了强大、可扩展且可靠的基础。通过遵守全球公认的标准,结构化布线可促进高速连接、简化故障排除并确保未来的可扩展性。考虑到这些优势,企业应优先
    的头像 发表于 04-07 11:15 880次阅读