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

MySQL 进阶学习文档

一、存储引擎

1.1 核心架构

  • 四层架构:连接层 → 服务层 → 引擎层 → 存储层
  • 插件式存储引擎:不同引擎独立管理数据存储,可动态选择

1.2 主流引擎对比

特性InnoDB(默认)MyISAMMemory
事务支持✅ 支持❌ 不支持❌ 不支持
锁粒度行锁表锁表锁
外键支持✅ 支持❌ 不支持❌ 不支持
存储位置磁盘磁盘内存
适用场景高并发事务读多写少临时数据缓存

选择建议

  • 优先选 InnoDB(支持事务和外键)
  • 读多写少且无需事务选 MyISAM
  • 临时数据用 Memory

二、索引优化

2.1 索引原理

  • B + 树结构
    • 叶子节点存储完整数据(聚集索引)
    • 非叶子节点仅存储索引值和指针
  • Hash 索引
    • 快速等值查询(WHERE name='xxx'
    • 不支持范围查询(BETWEEN...

2.2 索引类型

类型说明示例
主键索引唯一标识记录(自动创建)PRIMARY KEY (id)
唯一索引保证值唯一UNIQUE KEY (email)
组合索引多字段联合索引INDEX idx_name_age (name, age)
全文索引文本关键词搜索FULLTEXT INDEX (content)
索引类型唯一性字段类型适用场景
主键索引强制唯一整数、UUID 等表的唯一标识
唯一索引唯一邮箱、手机号等确保字段值不重复
常规索引非唯一常用查询字段加速WHEREORDER BY
全文索引非唯一文本类型关键词搜索(如文章内容)

为什么需要不同索引?

  • 主键索引:确保数据唯一性,加速数据定位。
  • 唯一索引:约束业务规则(如邮箱不能重复)。
  • 常规索引:提升查询效率,减少全表扫描。
  • 全文索引:支持复杂文本搜索(如LIKE '%关键词%'的优化)

2.3 索引优化策略

  1. 最左前缀原则:组合索引需按顺序使用最左字段

    -- 有效
    SELECT * FROM users WHERE name='Tom' AND age=20;
    -- 无效(跳过age)
    SELECT * FROM users WHERE name='Tom' AND gender='M';
    
  2. 避免索引失效

    • 不要在索引列上做运算(WHERE age+1=20
    • 字符串不加引号(WHERE phone=13812345678
    • 模糊查询前导 %(WHERE name LIKE '%Tom'
  3. 覆盖索引:查询字段全部包含在索引中

    CREATE INDEX idx_user_info ON users(name, age, email);
    SELECT name, age FROM users WHERE email='tom@example.com';
    

三、SQL 性能优化

3.1 执行计划分析

使用EXPLAIN分析查询性能:

EXPLAIN SELECT * FROM orders WHERE status=1;

关键指标解读:

  • type: 连接类型(ref优于range优于all
  • key: 实际使用的索引
  • rows: 预估扫描行数
  • ExtraUsing index表示覆盖索引

3.2 分页优化

问题LIMIT 100000,10性能差
优化

-- 基于覆盖索引
SELECT * FROM orders 
WHERE id > (SELECT id FROM orders LIMIT 100000,1)
LIMIT 10;

3.3 锁优化

  • 行锁:InnoDB 默认使用行锁(基于索引)
  • 表锁:MyISAM 使用表锁,适合低并发场景
  • 意向锁:InnoDB 通过意向锁减少锁冲突

四、事务与隔离级别

4.1 事务特性(ACID)

  • 原子性:通过undo log实现回滚
  • 一致性:事务前后数据状态一致
  • 隔离性:通过锁和 MVCC 实现
  • 持久性:通过redo log保证数据持久化

4.2 隔离级别对比

隔离级别脏读不可重复读幻读实现方式
Read Uncommitted无锁
Read Committed行锁
Repeatable ReadMVCC + 行锁
Serializable全表锁

推荐:默认使用Repeatable Read,兼顾一致性和性能

五、高级功能

5.1 视图

作用:简化复杂查询,提高安全性

CREATE VIEW v_user_info AS
SELECT id, name, email FROM users WHERE status=1;

5.2 存储过程

示例:计算员工平均薪资

DELIMITER $$
CREATE PROCEDURE GetAvgSalary()
BEGIN
  SELECT AVG(salary) AS avg_salary FROM employees;
END$$
DELIMITER ;

5.3 触发器

示例:记录用户操作日志

CREATE TRIGGER log_user_operation
AFTER UPDATE ON users
FOR EACH ROW
INSERT INTO user_logs(user_id, operation, timestamp)
VALUES(OLD.id, 'update', NOW());

六、InnoDB 引擎深度解析

6.1 核心组件

  • Buffer Pool:缓存数据页和索引页
  • Change Buffer:优化非唯一索引的写操作
  • Redo Log:保证事务持久性
  • Undo Log:支持回滚和 MVCC

6.2 MVCC 原理

  • 版本链:通过DB_TRX_IDDB_ROLL_PTR实现多版本控制
  • ReadView:记录活跃事务 ID,决定可见性规则

七、管理工具

7.1 备份恢复

全库备份

mysqldump -uroot -p --all-databases > full_backup.sql

恢复数据

mysql -uroot -p < full_backup.sql

7.2 性能监控

-- 查看慢查询日志
SHOW VARIABLES LIKE 'slow_query_log';

-- 查看索引使用情况
SELECT index_name, rows_read, rows_index_first 
FROM information_schema.table_statistics 
WHERE table_schema='your_db';

相关文章:

  • 工作记录 2017-02-08
  • 区块链交易签名相关知识总结
  • 经典面试题:C/C++中static关键字的三大核心作用与实战应用
  • 详解过程内聚、时间内聚、顺序内聚、逻辑内聚
  • OpenCV旋转估计(1)用于估计图像间仿射变换关系的类cv::detail::AffineBasedEstimator
  • 8.2《二力平衡》
  • 好看的网络安全登录页面 vue http网络安全
  • 重要重要!!改进求取Fisher矩阵的方法: 加权正则化Fisher矩阵
  • 蓝桥备考--必考题型--广度优先搜索bfs
  • 带旋转的目标标注工具-X-AnyLabeling
  • 【pytest框架源码分析五】pytest插件的注册流程
  • 基于Netty实现高性能HTTP服务的架构解析
  • 设备健康管理:给工业设备装上 “智能体检中心”—— 从故障救火到全生命周期守护
  • 基于SpringBoot的“ERP-物资管理”的设计与实现(源码+数据库+文档+PPT)
  • WPF 开发从入门到进阶(五)
  • shell 脚本搭建apache
  • MCP(Model Context Protocol)的介绍与开发初体验
  • Java面试黄金宝典4
  • Clion远程开发配置
  • 【QA】C和C++有哪些常用的调用约定
  • 欢迎回家!神十九返回舱成功着陆
  • 2024“好评中国”网络评论大赛结果揭晓
  • 民生银行一季度净利127.42亿降逾5%,营收增7.41%
  • 新经济与法|如何治理网购刷单与控评?数据合规管理是关键
  • 一张老照片里蕴含的上海文脉
  • 王文涛会见德国汽车工业协会主席穆勒