Skip to content

MySQL 数据库

🎯 场景:数据库操作入门

┌─────────────────────────────────────────────────────────────────┐
│                      MySQL 数据库操作                           │
├─────────────────────────────────────────────────────────────────┤
│                                                                │
│   -- 创建数据库                                                │
│   CREATE DATABASE mydb;                                        │
│                                                                │
│   -- 连接数据库                                                │
│   USE mydb;                                                    │
│                                                                │
│   -- 创建表                                                    │
│   CREATE TABLE users (                                         │
│       id INT PRIMARY KEY AUTO_INCREMENT,                       │
│       name VARCHAR(50) NOT NULL,                               │
│       age INT,                                                 │
│       email VARCHAR(100)                                       │
│   );                                                           │
│                                                                │
│   -- 插入数据                                                  │
│   INSERT INTO users (name, age, email)                         │
│   VALUES ('张三', 25, 'zhangsan@example.com');                 │
│                                                                │
│   -- 查询数据                                                  │
│   SELECT * FROM users;                                         │
│                                                                │
└─────────────────────────────────────────────────────────────────┘

这段代码告诉我们什么?

  • MySQL 是关系型数据库,使用 SQL 语句操作
  • 基本操作包括创建数据库、创建表、插入数据、查询数据
  • 表结构包含字段定义、数据类型、约束条件

💡 实战场景:为什么需要数据库?

  • 持久化存储数据,比内存更可靠
  • 结构化管理数据,便于查询和维护
  • 支持并发操作,多用户同时访问
  • 提供事务支持,确保数据一致性

数据库基础

数据类型

MySQL 常用数据类型

类型描述示例
INT整数age INT
VARCHAR可变长度字符串name VARCHAR(50)
TEXT长文本description TEXT
DATE日期birthday DATE
DATETIME日期时间created_at DATETIME
DECIMAL精确小数price DECIMAL(10,2)
BOOLEAN布尔值active BOOLEAN

💡 实战提示:选择合适的数据类型可以节省存储空间和提高查询性能!

约束条件

常用约束

  • PRIMARY KEY - 主键,唯一标识
  • AUTO_INCREMENT - 自增
  • NOT NULL - 非空
  • UNIQUE - 唯一
  • FOREIGN KEY - 外键,关联其他表
  • DEFAULT - 默认值
sql
CREATE TABLE orders (
    id INT PRIMARY KEY AUTO_INCREMENT,
    user_id INT NOT NULL,
    amount DECIMAL(10,2) NOT NULL,
    status VARCHAR(20) DEFAULT 'pending',
    created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
    FOREIGN KEY (user_id) REFERENCES users(id)
);

SQL 查询

基础查询

sql
-- 查询所有字段
SELECT * FROM users;

-- 查询指定字段
SELECT name, age FROM users;

-- 带条件查询
SELECT * FROM users WHERE age > 18;

-- 排序
SELECT * FROM users ORDER BY age DESC;

-- 限制结果
SELECT * FROM users LIMIT 10;

-- 分页
SELECT * FROM users LIMIT 10 OFFSET 20;

高级查询

sql
-- 聚合函数
SELECT COUNT(*) AS total_users FROM users;
SELECT AVG(age) AS avg_age FROM users;
SELECT MAX(age) AS max_age FROM users;

-- 分组
SELECT age, COUNT(*) AS count FROM users GROUP BY age;

-- 分组后过滤
SELECT age, COUNT(*) AS count FROM users GROUP BY age HAVING count > 1;

-- 多表关联
SELECT u.name, o.amount FROM users u
JOIN orders o ON u.id = o.user_id;

-- 子查询
SELECT * FROM users WHERE id IN (
    SELECT user_id FROM orders WHERE amount > 100
);

索引

索引类型

MySQL 索引类型

  • PRIMARY KEY - 主键索引
  • UNIQUE - 唯一索引
  • INDEX - 普通索引
  • FULLTEXT - 全文索引

创建索引

sql
-- 创建表时添加索引
CREATE TABLE users (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    email VARCHAR(100) UNIQUE,
    INDEX idx_age (age)
);

-- 为现有表添加索引
CREATE INDEX idx_name ON users(name);
CREATE UNIQUE INDEX idx_email ON users(email);

💡 面试点:索引的作用是什么?

  • 加速数据查询
  • 确保数据唯一性
  • 提高排序和分组性能

⚠️ 注意:索引会增加写操作的开销,不要过度使用!

事务

事务特性

ACID 特性

  • Atomicity - 原子性:要么全部执行,要么全部回滚
  • Consistency - 一致性:事务前后数据状态一致
  • Isolation - 隔离性:事务之间互不干扰
  • Durability - 持久性:事务提交后数据永久保存

事务操作

sql
-- 开始事务
START TRANSACTION;

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

-- 提交事务
COMMIT;

-- 回滚事务
-- ROLLBACK;

事务隔离级别

MySQL 隔离级别

  1. READ UNCOMMITTED - 读未提交
  2. READ COMMITTED - 读已提交
  3. REPEATABLE READ - 可重复读(默认)
  4. SERIALIZABLE - 串行化
sql
-- 设置隔离级别
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;

性能优化

慢查询优化

  1. 使用索引:为常用查询字段创建索引
  2. 避免全表扫描:使用 WHERE 子句过滤数据
  3. **避免 SELECT ***:只查询需要的字段
  4. 使用 LIMIT:限制返回结果数量
  5. 优化 JOIN:避免过多表关联

数据库设计优化

  1. 范式化:减少数据冗余
  2. 反范式化:适当冗余提高查询性能
  3. 分区表:大表分区提高管理和查询效率
  4. 分库分表:水平拆分和垂直拆分

配置优化

  • 调整 innodb_buffer_pool_size(推荐为内存的 50-80%)
  • 调整 query_cache_size(查询缓存)
  • 调整 max_connections(最大连接数)

备份与恢复

备份

bash
-- 备份整个数据库
mysqldump -u root -p mydb > mydb_backup.sql

-- 备份指定表
mysqldump -u root -p mydb users orders > tables_backup.sql

-- 备份结构
mysqldump -u root -p --no-data mydb > structure.sql

恢复

bash
-- 恢复数据库
mysql -u root -p mydb < mydb_backup.sql

-- 从备份文件中恢复数据
mysql -u root -p mydb
mysql> SOURCE mydb_backup.sql;

常见问题

连接问题

  • 检查网络连接
  • 检查 MySQL 服务是否运行
  • 检查用户名和密码
  • 检查防火墙设置

性能问题

  • 查看慢查询日志:SHOW VARIABLES LIKE 'slow_query_log'
  • 分析查询执行计划:EXPLAIN SELECT * FROM users WHERE age > 18
  • 检查索引使用情况:SHOW INDEX FROM users

数据问题

  • 数据丢失:定期备份
  • 数据损坏:使用 CHECK TABLEREPAIR TABLE
  • 死锁:优化事务和查询

总结

MySQL 核心知识点

知识点面试频率实战重要性
SQL 基础⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
索引优化⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
事务处理⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
性能调优⭐⭐⭐⭐⭐⭐⭐⭐
备份恢复⭐⭐⭐⭐⭐⭐⭐

⚠️ 易错点提醒

  1. 不要在生产环境中使用 SELECT *
  2. 注意索引的使用场景,不要过度索引
  3. 事务要及时提交或回滚,避免长时间占用锁
  4. 定期备份数据库,防止数据丢失
  5. 注意 SQL 注入风险,使用参数化查询