Skip to content

MySQL 数据库

欢迎来到 MySQL 数据库知识库!

🐬 MySQL 简介

MySQL 是世界上最流行的开源关系型数据库管理系统之一,以其可靠性、易用性和高性能而著称。广泛应用于Web应用、企业应用和嵌入式数据库系统。

🎯 适用场景

✅ 特别适合

  • Web 应用 - LAMP/LNMP 栈的核心
  • 中小型应用 - 电商、CMS、论坛
  • 读多写少 - 博客、新闻网站
  • OLTP 事务 - 订单、支付、用户系统
  • 分布式架构 - 主从复制、读写分离

⚠️ 不太适合

  • 极高并发写入(可以使用分库分表)
  • 复杂的 OLAP 分析(推荐 ClickHouse)
  • 非结构化数据(推荐 MongoDB)

🎯 学习路线

第一阶段:SQL 基础 (1-2周)

  1. 数据定义 (DDL)

    • CREATE 创建表
    • ALTER 修改表
    • DROP 删除表
  2. 数据操作 (DML)

    • INSERT 插入
    • UPDATE 更新
    • DELETE 删除
  3. 数据查询 (DQL)

    • SELECT 查询
    • WHERE 条件
    • JOIN 连接
    • GROUP BY 分组
    • ORDER BY 排序

第二阶段:高级特性 (2-3周)

  1. 索引

    • B+ 树索引
    • 唯一索引
    • 联合索引
    • 覆盖索引
  2. 事务

    • ACID 特性
    • 隔离级别
    • 锁机制
  3. 存储过程与触发器

    • 存储过程
    • 函数
    • 触发器

第三阶段:性能优化 (持续)

  1. 查询优化

    • EXPLAIN 分析
    • 慢查询日志
    • 索引优化
  2. 架构优化

    • 主从复制
    • 读写分离
    • 分库分表

✨ MySQL 特点

✅ 核心优势

  • 开源免费 - 社区版完全开源
  • 易于使用 - 安装配置简单
  • 高性能 - 优化的查询引擎
  • 可靠性 - 事务支持、ACID 保证
  • 跨平台 - 支持多种操作系统
  • 社区活跃 - 丰富的文档和资源
  • 生态完善 - 各种语言的驱动支持

🔧 存储引擎

引擎事务特点适用场景
InnoDB行锁支持外键、事务默认引擎、通用场景
MyISAM表锁查询快、不支持事务只读场景(已过时)
Memory表锁内存存储临时数据、缓存

📖 SQL 速查

数据库操作

sql
-- 创建数据库
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

-- 删除数据库
DROP DATABASE mydb;

-- 使用数据库
USE mydb;

表操作

sql
-- 创建表
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(50) NOT NULL UNIQUE,
    email VARCHAR(100),
    age INT,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    INDEX idx_username (username)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 修改表
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
ALTER TABLE users MODIFY COLUMN age TINYINT;
ALTER TABLE users DROP COLUMN phone;

-- 删除表
DROP TABLE users;

CRUD 操作

sql
-- 插入
INSERT INTO users (username, email, age) VALUES ('张三', 'zhang@example.com', 25);

-- 批量插入
INSERT INTO users (username, email, age) VALUES 
    ('李四', 'li@example.com', 30),
    ('王五', 'wang@example.com', 28);

-- 查询
SELECT * FROM users;
SELECT username, email FROM users WHERE age > 25;
SELECT * FROM users WHERE username LIKE '张%';
SELECT * FROM users ORDER BY age DESC LIMIT 10;

-- 更新
UPDATE users SET age = 26 WHERE username = '张三';

-- 删除
DELETE FROM users WHERE id = 1;

高级查询

sql
-- JOIN 连接
SELECT u.username, o.order_no 
FROM users u
INNER JOIN orders o ON u.id = o.user_id;

-- 分组聚合
SELECT age, COUNT(*) as count 
FROM users 
GROUP BY age 
HAVING count > 1;

-- 子查询
SELECT * FROM users 
WHERE age > (SELECT AVG(age) FROM users);

🔍 索引优化

创建索引

sql
-- 普通索引
CREATE INDEX idx_email ON users(email);

-- 唯一索引
CREATE UNIQUE INDEX idx_username ON users(username);

-- 联合索引
CREATE INDEX idx_age_created ON users(age, created_at);

-- 全文索引
CREATE FULLTEXT INDEX idx_content ON articles(content);

-- 查看索引
SHOW INDEX FROM users;

-- 删除索引
DROP INDEX idx_email ON users;

索引使用原则

  1. 最左前缀原则 - 联合索引从左到右匹配
  2. 避免索引失效 - 函数、隐式转换、!=、NOT IN
  3. 覆盖索引 - 查询字段都在索引中
  4. 索引选择性 - 区分度高的字段优先

🔒 事务

sql
-- 开始事务
START TRANSACTION;

-- 执行操作
UPDATE accounts SET balance = balance - 100 WHERE id = 1;
UPDATE accounts SET balance = balance + 100 WHERE id = 2;

-- 提交
COMMIT;

-- 回滚
ROLLBACK;

隔离级别

sql
-- 查看隔离级别
SELECT @@transaction_isolation;

-- 设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
隔离级别脏读不可重复读幻读
READ UNCOMMITTED
READ COMMITTED
REPEATABLE READ (默认)
SERIALIZABLE

📊 性能优化

EXPLAIN 分析

sql
EXPLAIN SELECT * FROM users WHERE age > 25;

关键字段:

  • type - 连接类型(system > const > eq_ref > ref > range > index > ALL)
  • key - 实际使用的索引
  • rows - 扫描的行数
  • Extra - 额外信息(Using index、Using filesort)

慢查询日志

sql
-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2;

-- 查看慢查询
SHOW VARIABLES LIKE 'slow_query%';

🚀 高可用架构

主从复制

┌─────────┐  写入   ┌─────────┐
│  应用   │ ─────> │  Master │
└─────────┘         └─────────┘
     │                   │
     │ 读取              │ 同步
     ↓                   ↓
┌─────────┐         ┌─────────┐
│ Slave 1 │ <────── │ Slave 2 │
└─────────┘         └─────────┘

读写分离

  • 写操作 → Master
  • 读操作 → Slave(负载均衡)

💡 最佳实践

  1. 表设计

    • 选择合适的数据类型
    • NOT NULL + DEFAULT
    • 主键使用 AUTO_INCREMENT
    • 时间字段使用 TIMESTAMP
  2. 索引设计

    • 主键索引
    • 高频查询字段添加索引
    • 联合索引注意顺序
    • 避免过多索引
  3. 查询优化

    • SELECT 指定字段,避免 SELECT *
    • 使用 LIMIT 分页
    • 避免 OR,使用 IN
    • 避免在 WHERE 中使用函数
  4. 安全

    • 最小权限原则
    • 定期备份
    • 参数化查询防止 SQL 注入

📖 学习资源

官方资源

推荐书籍

  • 《高性能 MySQL》
  • 《MySQL 技术内幕:InnoDB 存储引擎》
  • 《MySQL 必知必会》

准备好了吗?开始你的 MySQL 学习之旅!