SQL 基础与进阶笔记
一、SQL 基础分类
1. DDL (数据定义语言)
建表语句
1 |
|
索引操作
1 |
|
修改表结构
1 |
|
2. DML (数据操作语言)
增删改查
1 |
|
3. 事务控制
ACID 特性
- 原子性(Atomicity): 事务是不可分割的工作单位
- 一致性(Consistency): 事务执行前后数据库保持一致状态
- 隔离性(Isolation): 事务执行不受其他事务干扰
- 持久性(Durability): 事务提交后改变是永久的
隔离级别
1 |
|
二、复杂查询
1. 联表查询 (JOIN)
1 |
|
2. 子查询
1 |
|
3. 聚合函数
1 |
|
三、性能优化
1. 执行计划分析
1 |
|
2. 索引设计原则
适合建索引的列:
- WHERE子句中的条件列
- JOIN关联的列
- ORDER BY排序的列
- GROUP BY分组的列
索引设计最佳实践:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15-- 联合索引最左前缀原则
CREATE INDEX idx_name_dept ON employees(name, department_id);
-- 能命中索引的情况:
SELECT * FROM employees WHERE name = '张三';
SELECT * FROM employees WHERE name = '张三' AND department_id = 1;
-- 不能命中索引的情况:
SELECT * FROM employees WHERE department_id = 1;
-- 避免索引失效的情况:
-- 1. 使用函数或运算
SELECT * FROM employees WHERE YEAR(hire_date) = 2023; -- 索引失效
-- 2. 使用不等于(!=或<>)
SELECT * FROM employees WHERE name != '张三'; -- 索引失效
-- 3. 使用LIKE以通配符开头
SELECT * FROM employees WHERE name LIKE '%张%'; -- 索引失效
3. 慢SQL分析与优化
开启慢查询日志:
1
2
3
4
5-- MySQL配置
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 2 -- 超过2秒的查询
log_queries_not_using_indexes = 1 -- 记录未使用索引的查询优化策略:
- 重写复杂查询,拆分为多个简单查询
- 避免SELECT *,只查询需要的列
- 使用LIMIT限制返回行数
- 对大表分页查询优化:
1
2
3
4
5
6
7-- 低效写法
SELECT * FROM large_table LIMIT 1000000, 10;
-- 高效写法(使用索引覆盖)
SELECT * FROM large_table
WHERE id > (SELECT id FROM large_table ORDER BY id LIMIT 1000000, 1)
LIMIT 10;
表结构优化:
- 适当拆分大表(垂直/水平拆分)
- 选择合适的数据类型(如用INT代替VARCHAR存储ID)
- 对TEXT/BLOB大字段单独存表
四、实用技巧
1. 窗口函数(MySQL 8.0+)
1 |
|
2. 公用表表达式(CTE)
1 |
|
3. 临时表
1 |
|