-- 读写分离示例
-- 主库:写操作
INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com');
-- 从库:读操作
SELECT * FROM users WHERE id = 1;
2. 设计层优化
范式与反范式的平衡
数据类型选择原则
表结构设计最佳实践
3. SQL层优化
慢查询定位与分析
执行计划解读
索引优化策略
4. 配置层优化
关键参数调优
缓存机制优化
连接池配置
三、索引优化深度解析
1. 索引原理
java复制代码
// B+树索引结构类比
public class BPlusTree {
// 非叶子节点:只存储索引键和指针
// 叶子节点:存储完整数据,形成链表
}
2. 索引类型及适用场景
sql复制代码
-- 聚簇索引 vs 非聚簇索引
-- 创建复合索引
CREATE INDEX idx_user_created ON users(created_at, status);
-- 覆盖索引示例
EXPLAIN SELECT id, name FROM users WHERE created_at > '2023-01-01';
3. 索引失效的常见场景
sql复制代码
-- 1. 函数操作导致索引失效
SELECT * FROM users WHERE DATE(created_at) = '2023-01-01'; -- ❌
SELECT * FROM users WHERE created_at >= '2023-01-01' AND created_at < '2023-01-02'; -- ✅
-- 2. 前导模糊查询
SELECT * FROM users WHERE name LIKE '%张%'; -- ❌
SELECT * FROM users WHERE name LIKE '张%'; -- ✅
-- 3. 类型转换
SELECT * FROM users WHERE phone = 13800138000; -- ❌
SELECT * FROM users WHERE phone = '13800138000'; -- ✅
四、SQL语句优化实战
1. 查询优化
sql复制代码
-- 分页优化:传统 vs 优化版
-- 传统分页(数据量大时性能差)
SELECT * FROM orders ORDER BY id LIMIT 10000, 20;
-- 优化分页(使用游标)
SELECT * FROM orders WHERE id > 10000 ORDER BY id LIMIT 20;
-- EXISTS vs IN 的选择
-- 当子查询结果集大时使用EXISTS
SELECT * FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id AND o.amount > 1000);
-- 当子查询结果集小时使用IN
SELECT * FROM users WHERE id IN (1, 2, 3, 4, 5);
2. 批量操作优化
python复制代码
# Python批量插入优化
# 不推荐:逐条插入
for user in user_list:
cursor.execute("INSERT INTO users (name, email) VALUES (%s, %s)", (user['name'], user['email']))
# 推荐:批量插入
data = [(user['name'], user['email']) for user in user_list]
cursor.executemany("INSERT INTO users (name, email) VALUES (%s, %s)", data)
# Django ORM优化示例
# 避免N+1查询
# 不推荐
users = User.objects.all()
for user in users:
print(user.profile.bio) # 每次循环都会查询数据库
# 推荐:使用select_related或prefetch_related
users = User.objects.select_related('profile').all()
for user in users:
print(user.profile.bio) # 一次查询搞定
java复制代码
// Spring Boot + JPA优化
@Entity
public class User {
@Id
private Long id;
// 懒加载大字段
@Basic(fetch = FetchType.LAZY)
@Lob
private String biography;
// 使用@NamedEntityGraph优化查询
@NamedEntityGraph(
name = "User.withProfile",
attributeNodes = @NamedAttributeNode("profile")
)
}
-- 查看慢查询
SHOW VARIABLES LIKE 'slow_query_log%';
SHOW VARIABLES LIKE 'long_query_time';
-- 分析执行计划
EXPLAIN FORMAT=JSON
SELECT u.name, COUNT(o.id)
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
GROUP BY u.id;
-- 查看索引使用情况
SELECT * FROM sys.schema_index_statistics;