当前位置: 首页 > news >正文

MySQL核心知识点梳理

MySQL 全面深入总结

1. 数据库设计与范式

1.1 三范式详解

第一范式(1NF)

  • 字段具有原子性,不可再分

  • 所有关系型数据库都满足1NF

  • 实际应用:避免在一个字段中存储多个值(如逗号分隔的列表)

第二范式(2NF)

  • 满足1NF,且非主属性完全依赖于主键

  • 消除部分函数依赖

  • 必须有主键来唯一标识每条记录

第三范式(3NF)

  • 满足2NF,且消除传递依赖

  • 非主属性之间不能有依赖关系

  • 所有非主属性都直接依赖于主键

反范式设计
在实际应用中,为了性能考虑会适当违反范式:

  • 适当冗余减少JOIN操作

  • 预计算统计字段(如计数、总和)

  • 读写分离场景下的数据冗余

2. 存储引擎深度对比

2.1 InnoDB vs MyISAM 全面对比

特性InnoDBMyISAM
事务支持支持(ACID)不支持
锁级别行级锁表级锁
外键支持不支持
MVCC支持不支持
崩溃恢复支持较弱
全文索引5.6+支持支持
存储限制64TB256TB
数据缓存数据和索引仅索引
** count(*) **需要扫描直接返回

2.2 存储引擎选择策略

选择InnoDB的情况:

  • 需要事务支持

  • 高并发读写

  • 数据一致性要求高

  • 需要外键约束

选择MyISAM的情况:

  • 读多写少,且不需要事务

  • 全文搜索需求(MySQL 5.6前)

  • 数据仓库类应用

3. 索引机制深度解析

3.1 索引类型

普通索引

CREATE INDEX idx_name ON users(name);

唯一索引

CREATE UNIQUE INDEX idx_email ON users(email);

主键索引

-- 自动创建,不允许NULL
ALTER TABLE users ADD PRIMARY KEY (id);

组合索引

CREATE INDEX idx_name_city ON users(name, city, age);

全文索引

CREATE FULLTEXT INDEX idx_content ON articles(content);

3.2 B+树索引原理

数据结构特点:

  • 所有数据存储在叶子节点

  • 叶子节点形成双向链表,支持范围查询

  • 非叶子节点只存储索引信息

  • 树高度平衡,查询效率稳定

索引优势:

  • 大幅减少数据扫描量

  • 避免排序和临时表

  • 将随机I/O变为顺序I/O

3.3 索引优化策略

最左前缀原则

-- 索引: (name, city, age)
SELECT * FROM users WHERE name = 'John'; -- ✅ 使用索引
SELECT * FROM users WHERE name = 'John' AND city = 'Beijing'; -- ✅ 使用索引
SELECT * FROM users WHERE city = 'Beijing'; -- ❌ 不满足最左前缀

覆盖索引

-- 索引: (name, email)
SELECT name, email FROM users WHERE name = 'John'; -- ✅ 覆盖索引,无需回表

索引下推

-- MySQL 5.6+ 在存储引擎层过滤数据
SELECT * FROM users WHERE name LIKE 'J%' AND age > 25;

4. 事务与锁机制

4.1 事务隔离级别

隔离级别脏读不可重复读幻读实现方式
读未提交无锁
读已提交语句级快照
可重复读事务级快照+间隙锁
串行化完全串行

MySQL默认:可重复读(REPEATABLE READ)

4.2 InnoDB锁类型

行级锁

  • 记录锁(Record Lock):锁定单行记录

  • 间隙锁(Gap Lock):锁定记录之间的间隙

  • 临键锁(Next-Key Lock):记录锁+间隙锁

表级锁

  • 意向共享锁(IS)

  • 意向排他锁(IX)

4.3 MVCC多版本并发控制

实现原理:

  • 每行记录包含隐藏字段:DB_TRX_ID、DB_ROLL_PTR

  • 通过Undo Log维护数据历史版本

  • ReadView判断数据可见性

优点:

  • 读不阻塞写,写不阻塞读

  • 非阻塞读提高并发性能

5. 查询优化与执行计划

5.1 查询执行流程

SQL语句 → 解析器 → 预处理器 → 优化器 → 执行计划 → 执行引擎 → 结果返回

5.2 EXPLAIN详解

关键字段说明:

type(访问类型,性能从好到坏):

  • system:表只有一行

  • const:通过主键或唯一索引查询

  • eq_ref:多表JOIN使用主键或唯一索引

  • ref:使用非唯一索引查找

  • range:索引范围扫描

  • index:全索引扫描

  • ALL:全表扫描

Extra重要信息:

  • Using index:覆盖索引

  • Using where:Server层过滤

  • Using temporary:使用临时表

  • Using filesort:使用文件排序

  • Using join buffer:使用连接缓冲

5.3 优化器决策因素

  • 统计信息(表大小、索引选择性)

  • 查询成本估算

  • 系统资源(内存、I/O能力)

  • 提示(FORCE INDEX、USE INDEX)

6. 高级SQL技巧

6.1 复杂查询优化

子查询优化

-- 优化前
SELECT * FROM users 
WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000);-- 优化后
SELECT u.* FROM users u 
JOIN orders o ON u.id = o.user_id 
WHERE o.amount > 1000;

分页优化

-- 传统分页(性能差)
SELECT * FROM articles ORDER BY id LIMIT 100000, 20;-- 优化分页(游标方式)
SELECT * FROM articles WHERE id > 100000 ORDER BY id LIMIT 20;

6.2 高级JOIN技巧

派生表优化

SELECT u.name, t.order_count
FROM users u
JOIN (SELECT user_id, COUNT(*) as order_countFROM orders GROUP BY user_id
) t ON u.id = t.user_id;

窗口函数(MySQL 8.0+)

SELECT user_id,order_date,amount,SUM(amount) OVER (PARTITION BY user_id ORDER BY order_date) as running_total
FROM orders;

7. 复制与高可用

7.1 复制原理

复制流程:

  1. 主库将更改写入二进制日志(binlog)

  2. 从库IO线程拉取binlog到中继日志(relay log)

  3. 从库SQL线程重放relay log中的事件

复制类型:

  • 基于语句的复制(SBR)

  • 基于行的复制(RBR)

  • 混合复制(MBR)

7.2 高可用架构

主从复制

-- 主库配置
[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW-- 从库配置
[mysqld]
server-id = 2
relay_log = mysql-relay-bin
read_only = 1

半同步复制

-- 确保数据安全
plugin_load = "rpl_semi_sync_master=semisync_master.so"
rpl_semi_sync_master_enabled = 1

组复制(MySQL 8.0+)

  • 基于Paxos协议的多主复制

  • 自动故障检测和恢复

  • 数据强一致性

8. 性能调优实战

8.1 内存参数优化

InnoDB缓冲池

-- 建议设置为物理内存的70-80%
innodb_buffer_pool_size = 16G
innodb_buffer_pool_instances = 8  -- 每个实例>=1GB

其他关键参数

-- 日志缓冲区
innodb_log_buffer_size = 64M
innodb_log_file_size = 1G-- 连接和线程
max_connections = 1000
thread_cache_size = 64-- 查询缓存(MySQL 8.0已移除)
query_cache_type = 0
query_cache_size = 0

8.2 监控与诊断

Performance Schema

-- 查看最耗时的SQL
SELECT * FROM sys.statement_analysis 
ORDER BY avg_latency DESC LIMIT 10;-- 查看锁等待
SELECT * FROM sys.innodb_lock_waits;

慢查询分析

-- 开启慢查询日志
slow_query_log = 1
slow_query_log_file = /var/log/mysql/slow.log
long_query_time = 2
log_queries_not_using_indexes = 1

9. 分区表策略

9.1 分区类型

范围分区

CREATE TABLE sales (id INT,sale_date DATE,amount DECIMAL(10,2)
) PARTITION BY RANGE (YEAR(sale_date)) (PARTITION p2020 VALUES LESS THAN (2021),PARTITION p2021 VALUES LESS THAN (2022),PARTITION p2022 VALUES LESS THAN (2023)
);

哈希分区

CREATE TABLE users (id INT,name VARCHAR(50)
) PARTITION BY HASH (id) PARTITIONS 4;

9.2 分区优势

  • 性能提升:分区裁剪减少数据扫描

  • 管理便捷:可独立备份、恢复分区

  • 数据生命周期:轻松删除过期数据

10. 备份与恢复

10.1 备份策略

物理备份(XtraBackup)

# 全量备份
xtrabackup --backup --target-dir=/backup/full# 增量备份
xtrabackup --backup --target-dir=/backup/inc1 --incremental-basedir=/backup/full

逻辑备份(mysqldump)

# 全库备份
mysqldump --single-transaction --routines --triggers --all-databases > backup.sql# 单表备份
mysqldump --single-transaction database table > table.sql

10.2 恢复策略

时间点恢复

# 恢复全量备份
mysql < full_backup.sql# 应用binlog恢复
mysqlbinlog --start-datetime="2023-01-01 00:00:00" binlog.000001 | mysql

11. 安全最佳实践

11.1 访问控制

-- 最小权限原则
CREATE USER 'app_user'@'192.168.1.%' IDENTIFIED BY 'password';
GRANT SELECT, INSERT, UPDATE ON database.* TO 'app_user'@'192.168.1.%';-- 定期权限审计
SELECT * FROM mysql.user WHERE authentication_string = '';

11.2 数据加密

-- 表空间加密
ALTER TABLE sensitive_data ENCRYPTION='Y';-- 数据传输加密
[mysqld]
require_secure_transport = ON
ssl_ca = /path/to/ca.pem
ssl_cert = /path/to/server-cert.pem
ssl_key = /path/to/server-key.pem

12. 云原生与容器化

12.1 MySQL在K8s中的部署

apiVersion: apps/v1
kind: StatefulSet
metadata:name: mysql
spec:serviceName: mysqlreplicas: 3template:spec:containers:- name: mysqlimage: mysql:8.0env:- name: MYSQL_ROOT_PASSWORDvalueFrom:secretKeyRef:name: mysql-secretkey: password

12.2 读写分离架构

应用层 → 代理(ProxySQL/MaxScale)→ ├── 写主库└── 读从库(多个)

总结

MySQL作为一个成熟的关系型数据库,在性能、可靠性、功能丰富度方面都表现出色。关键成功因素包括:

  1. 合理的数据模型设计:平衡范式与性能

  2. 精准的索引策略:覆盖索引、最左前缀原则

  3. 优化的事务处理:MVCC、行级锁、合适的隔离级别

  4. 有效的监控调优:执行计划分析、参数优化

  5. 可靠的备份恢复:物理+逻辑备份,定期恢复测试

  6. 安全的运行环境:访问控制、数据加密、网络隔离

随着MySQL 8.0的普及,窗口函数、CTE、原子DDL等新特性进一步增强了其在大数据量、高并发场景下的竞争力。结合云原生技术,MySQL继续在现代应用架构中扮演重要角色。

http://www.dtcms.com/a/597909.html

相关文章:

  • 天长做网站的电子商务网站基础建设
  • 【论文阅读】Hypercomplex Prompt-aware Multimodal Recommendation
  • 邵阳优秀网站建设有什么网站可以做数学题
  • Linux 内存管理 (4):buddy 管理系统的建立
  • 华为、思科、锐捷、华三定时备份配置命令对照表
  • 网站的404如何做湖北做网站的
  • C# 桌面框架与 Qt 对比分析
  • 更新网站要怎么做呢聊天软件
  • 自己开一个网站怎么赚钱广州互联网公司有哪些
  • MATLAB实现图像菲涅尔衍射
  • Linux开源代码汇总
  • stable-diffusion安装EasyPhoto启动报错解决
  • 做网站标题业之峰装饰官网
  • 做网站挂广告赚多少钱wordpress布局主题
  • PCB之电源完整性之电源网络的PDN仿真CST---08
  • AXI-5.3.1 Memory type requirements
  • Redis vs MongoDB:内存字典与文档库对决
  • 长沙手机网站首页设计公司淮南网络宾馆
  • Python应用指南:利用GET请求获取微博小时热搜榜
  • ROS2 Action 通信详解:从自定义消息到 Server/Client 实现(附 MoveIt! 联动示例)
  • 个人建什么网站最赚钱智慧团建网站登录平台pc端
  • 使用新版本cpu编译vLLM cpu端(编译完成,但是SCNet公网转发8000端口后,连不上)
  • 双浩建设网站aspnet网站开发pdf
  • 云南网站制作公司在线生成短链接
  • 上海企业网站制作报价燕郊网站建设
  • 东航数科开源软件治理体系的建设实践”荣获OSCAR开源+安全及风险治理案例
  • 查企业免费的网站郑州同济医院妇科怎么样
  • 基于SAM2的眼动数据跟踪2.1——修正目标消失的记录方式
  • 网站开发包含网站维护吗建设一个网站可以采用那几方案
  • 【C++】--模板进阶