MySQL教程 / 第 1 节
MySQL学习快速开始指南
🚀 立即开始
第一步:安装MySQL 5.7
Windows用户:
- 阅读 01-基础入门/01-MySQL概述与安装.md
- 下载MySQL 5.7 ZIP版本
- 按照教程完成安装和配置
- 验证安装成功
Linux用户:
- 使用YUM或APT安装
- 配置my.cnf文件
- 启动MySQL服务
- 运行安全配置脚本
第二步:学习基础SQL
必须掌握的SQL语句:
-- 数据库操作
CREATE DATABASE mydb;
USE mydb;
SHOW DATABASES;
-- 表操作
CREATE TABLE users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL,
age INT,
email VARCHAR(100),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 数据操作
INSERT INTO users (name, age, email) VALUES ('张三', 20, 'zhangsan@example.com');
SELECT * FROM users;
UPDATE users SET age = 21 WHERE id = 1;
DELETE FROM users WHERE id = 1;
第三步:理解索引(核心)⭐
创建你的第一个索引:
-- 创建测试表
CREATE TABLE test_users (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
age INT,
city VARCHAR(50)
);
-- 插入测试数据
INSERT INTO test_users (name, age, city) VALUES
('张三', 20, '北京'),
('李四', 25, '上海'),
('王五', 30, '广州');
-- 查看执行计划(没有索引)
EXPLAIN SELECT * FROM test_users WHERE name = '张三';
-- type: ALL(全表扫描)
-- 创建索引
CREATE INDEX idx_name ON test_users(name);
-- 再次查看执行计划
EXPLAIN SELECT * FROM test_users WHERE name = '张三';
-- type: ref(使用索引)
第四步:配置binlog(重要)⭐
编辑配置文件:
[mysqld]
# 开启binlog
log-bin=mysql-bin
binlog_format=ROW
server-id=1
重启MySQL并验证:
-- 查看binlog是否开启
SHOW VARIABLES LIKE 'log_bin';
-- 查看binlog文件
SHOW BINARY LOGS;
-- 查看当前binlog状态
SHOW MASTER STATUS;
第五步:学习EXPLAIN(必须精通)⭐
分析SQL性能:
-- 创建测试数据
CREATE TABLE orders (
id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
amount DECIMAL(10,2),
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
INDEX idx_user_id (user_id)
);
-- 分析查询
EXPLAIN SELECT * FROM orders WHERE user_id = 100;
-- 关注以下字段:
-- type: 访问类型(ALL最差,const最好)
-- key: 使用的索引
-- rows: 扫描的行数
-- Extra: 额外信息
📚 学习路径建议
新手阶段(1-2个月)
必学内容:
- ✅ MySQL安装和配置
- ✅ 基础SQL(DDL、DML、DQL)
- ✅ 数据类型和字符集
- ✅ 简单查询和多表连接
学习目标:
- 能够独立安装MySQL
- 熟练编写基本SQL语句
- 理解表结构设计
推荐章节:
- 第01章:MySQL概述与安装
- 第02-05章:SQL基础
进阶阶段(2-3个月)
必学内容:
- ✅ 索引原理和优化(核心)
- ✅ 事务和MVCC
- ✅ 锁机制
- ✅ 存储引擎
学习目标:
- 深入理解B+Tree索引
- 掌握EXPLAIN分析
- 理解事务隔离级别
- 能够诊断锁问题
推荐章节:
- 第06章:索引原理与优化
- 第08章:事务与并发控制
- 第09章:锁机制
高级阶段(3-4个月)
必学内容:
- ✅ binlog机制(核心)
- ✅ 备份和恢复
- ✅ SQL优化
- ✅ 性能调优
学习目标:
- 精通binlog的三种格式
- 制定完善的备份策略
- 能够优化慢SQL
- 掌握性能调优技巧
推荐章节:
- 第15章:MySQL日志系统
- 第16-17章:备份与恢复
- 第18章:SQL优化实战
- 第19-21章:性能优化
专家阶段(持续学习)
必学内容:
- ✅ 主从复制
- ✅ 高可用架构
- ✅ 监控和故障排查
- ✅ 分库分表
学习目标:
- 搭建主从复制环境
- 设计高可用方案
- 快速诊断和解决故障
- 处理海量数据
推荐章节:
- 第22章:主从复制
- 第24章:高可用方案
- 第26-28章:监控与诊断
- 第25章:分库分表
🎯 核心知识点速查
1. binlog三种格式
| 格式 | 优点 | 缺点 | 使用场景 |
|---|---|---|---|
| STATEMENT | 日志量小 | 可能导致主从不一致 | 不推荐 |
| ROW | 数据一致性最好 | 日志量大 | ⭐ 推荐(默认) |
| MIXED | 平衡 | 复杂 | 可选 |
2. EXPLAIN type类型(性能从好到差)
system > const > eq_ref > ref > range > index > ALL
- const: 主键或唯一索引查询(最优)
- ref: 非唯一索引查询
- range: 范围查询
- ALL: 全表扫描(需要优化)
3. 索引失效的场景
-- ❌ 在索引列上使用函数
WHERE YEAR(create_time) = 2024
-- ❌ 隐式类型转换
WHERE phone = 13800138000 -- phone是VARCHAR
-- ❌ 使用!=或<>
WHERE status != 1
-- ❌ 使用OR
WHERE name = '张三' OR age = 20
-- ❌ 前导模糊查询
WHERE name LIKE '%张%'
-- ❌ 违反最左前缀原则
-- 索引:(name, age, city)
WHERE age = 20 -- 跳过了name
4. 事务隔离级别
| 隔离级别 | 脏读 | 不可重复读 | 幻读 |
|---|---|---|---|
| READ UNCOMMITTED | ✓ | ✓ | ✓ |
| READ COMMITTED | ✗ | ✓ | ✓ |
| REPEATABLE READ(默认) | ✗ | ✗ | ✗ |
| SERIALIZABLE | ✗ | ✗ | ✗ |
5. 重要配置参数
[mysqld]
# binlog配置
log-bin=mysql-bin
binlog_format=ROW
sync_binlog=1
# InnoDB配置
innodb_buffer_pool_size=1G # 物理内存的50%-70%
innodb_log_file_size=512M
innodb_flush_log_at_trx_commit=1
# 连接配置
max_connections=500
# 慢查询配置
slow_query_log=1
long_query_time=2
🛠️ 实战练习
练习1:索引优化
-- 创建测试表
CREATE TABLE products (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(100),
category VARCHAR(50),
price DECIMAL(10,2),
stock INT,
create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
-- 插入10万条测试数据
-- (使用存储过程或脚本)
-- 任务:
-- 1. 分析以下SQL的执行计划
EXPLAIN SELECT * FROM products WHERE category = '电子产品' AND price > 1000;
-- 2. 创建合适的索引
-- 3. 再次分析执行计划,对比优化效果
练习2:binlog分析
-- 1. 执行一些DML操作
INSERT INTO users (name, age) VALUES ('测试用户', 25);
UPDATE users SET age = 26 WHERE name = '测试用户';
DELETE FROM users WHERE name = '测试用户';
-- 2. 查看binlog
SHOW MASTER STATUS;
-- 3. 使用mysqlbinlog工具分析
-- mysqlbinlog -vv mysql-bin.000001
-- 4. 尝试基于binlog恢复数据
练习3:慢查询优化
-- 1. 开启慢查询日志
SET GLOBAL slow_query_log=1;
SET GLOBAL long_query_time=1;
-- 2. 执行一些慢SQL
SELECT * FROM large_table WHERE YEAR(create_time) = 2024;
-- 3. 分析慢查询日志
-- pt-query-digest /var/lib/mysql/slow.log
-- 4. 优化SQL并验证效果
📖 推荐学习资源
官方文档
- MySQL 5.7 Reference Manual: https://dev.mysql.com/doc/refman/5.7/en/
在线工具
- EXPLAIN Analyzer: https://www.eversql.com/mysql-explain-analyzer/
- SQL Formatter: https://www.dpriver.com/pp/sqlformat.htm
推荐书籍
- 《高性能MySQL》(第3版)
- 《MySQL技术内幕:InnoDB存储引擎》
- 《MySQL排错指南》
❓ 常见问题
Q1: 学习MySQL需要多长时间?
A:
- 基础入门:1-2个月
- 进阶提升:2-3个月
- 高级应用:3-4个月
- 成为专家:持续学习
Q2: 必须按顺序学习吗?
A: 建议按顺序学习,但可以根据实际需求调整:
- 如果急需优化SQL,可以先学第18章
- 如果需要搭建主从,可以先学第22章
- 但基础知识(索引、事务)必须先掌握
Q3: 如何验证学习效果?
A:
- 完成每章的练习题
- 搭建实验环境动手实践
- 尝试解决实际问题
- 参加MySQL认证考试
Q4: MySQL 5.7和8.0有什么区别?
A: 主要区别:
- 8.0默认字符集是utf8mb4
- 8.0支持窗口函数、CTE
- 8.0移除了查询缓存
- 8.0性能更好
- 学会5.7后,升级到8.0很容易
🎓 学习建议
- 动手实践:每个知识点都要亲自操作验证
- 搭建环境:建议搭建主从环境进行实验
- 记录笔记:记录重点和遇到的问题
- 定期复习:重要章节需要反复学习
- 解决问题:尝试解决实际的生产问题
- 参与社区:加入MySQL技术社区交流
📞 获取帮助
遇到问题时:
- 查看错误日志:
/var/log/mysqld.log - 使用EXPLAIN分析SQL
- 查看官方文档
- 搜索Stack Overflow
- 参考本教程的故障排查章节
开始你的MySQL专家之路吧! 🚀
下一步:
- 新手:阅读 第01章:MySQL概述与安装
- 有基础:阅读 第15章:MySQL日志系统
- 需要优化:阅读 第18章:SQL优化实战