一、引言
- MySQL在Web开发中的重要性
- 优化带来的价值:性能提升、成本降低、用户体验改善
- 全栈视角下的MySQL优化意义
二、MySQL优化层次体系
1. 架构层优化
INSERT INTO users (name, email) VALUES ('张三', 'zhangsan@example.com');
SELECT * FROM users WHERE id = 1;
2. 设计层优化
- 范式与反范式的平衡
- 数据类型选择原则
- 表结构设计最佳实践
3. SQL层优化
4. 配置层优化
三、索引优化深度解析
1. 索引原理
public class BPlusTree {
}
2. 索引类型及适用场景
CREATE INDEX idx_user_created ON users(created_at, status);
EXPLAIN SELECT id, name FROM users WHERE created_at > '2023-01-01';
3. 索引失效的常见场景
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';
SELECT * FROM users WHERE name LIKE '%张%';
SELECT * FROM users WHERE name LIKE '张%';
SELECT * FROM users WHERE phone = 13800138000;
SELECT * FROM users WHERE phone = '13800138000';
四、SQL语句优化实战
1. 查询优化
SELECT * FROM orders ORDER BY id LIMIT 10000, 20;
SELECT * FROM orders WHERE id > 10000 ORDER BY id LIMIT 20;
SELECT * FROM users u
WHERE EXISTS (SELECT 1 FROM orders o WHERE o.user_id = u.id AND o.amount > 1000);
SELECT * FROM users WHERE id IN (1, 2, 3, 4, 5);
2. 批量操作优化
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)
@Insert("<script>" +
"INSERT INTO users (name, email) VALUES " +
"<foreach collection='list' item='user' separator=','>" +
"(#{user.name}, #{user.email})" +
"</foreach>" +
"</script>")
void batchInsertUsers(List<User> users);
五、数据库设计优化
1. 表结构设计
CREATE TABLE users (
id BIGINT PRIMARY KEY,
name VARCHAR(100),
email VARCHAR(100),
created_at TIMESTAMP
);
CREATE TABLE users_profile (
user_id BIGINT PRIMARY KEY,
avatar TEXT,
biography TEXT,
FOREIGN KEY (user_id) REFERENCES users(id)
);
2. 数据类型优化
CREATE TABLE optimized_table (
is_active TINYINT(1) NOT NULL DEFAULT 0,
view_count INT UNSIGNED NOT NULL DEFAULT 0,
price DECIMAL(10, 2) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
六、配置参数调优
1. 关键配置项
[mysqld]
innodb_buffer_pool_size = 4G
innodb_log_buffer_size = 64M
max_connections = 500
thread_cache_size = 50
query_cache_type = 0
七、全栈视角的优化实践
1. 后端优化策略
users = User.objects.all()
for user in users:
print(user.profile.bio)
users = User.objects.select_related('profile').all()
for user in users:
print(user.profile.bio)
@Entity
public class User {
@Id
private Long id;
@Basic(fetch = FetchType.LAZY)
@Lob
private String biography;
@NamedEntityGraph(
name = "User.withProfile",
attributeNodes = @NamedAttributeNode("profile")
)
}
2. 前端配合优化
<template>
<div>
<!-- 分页组件减少单次数据量 -->
<el-pagination
@size-change="handleSizeChange"
@current-change="handleCurrentChange"
:current-page="currentPage"
:page-sizes="[10, 20, 50, 100]"
:page-size="pageSize"
layout="total, sizes, prev, pager, next, jumper"
:total="total">
</el-pagination>
<!-- 虚拟滚动处理大数据量 -->
<virtual-list :size="50" :remain="20" :items="userList">
<template v-slot:default="item">
<user-item :user="item" />
</template>
</virtual-list>
</div>
</template>
<script>
export default {
data() {
return {
currentPage: 1,
pageSize: 20,
total: 0,
userList: []
}
},
methods: {
async loadUsers() {
// 只请求需要的数据
const params = {
page: this.currentPage,
size: this.pageSize,
fields: 'id,name,avatar' // 只请求必要字段
}
const { data } = await this.$api.getUsers(params)
this.userList = data.items
this.total = data.total
}
}
}
</script>
八、监控与诊断工具
1. 性能监控
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;
九、实战案例分享
案例1:电商系统订单查询优化
- 问题:订单列表查询缓慢
- 分析:复合索引缺失 + 分页性能问题
- 解决方案:创建(用户ID, 创建时间)复合索引 + 游标分页
案例2:社交平台Feed流优化
- 问题:好友动态查询性能差
- 分析:多表关联 + 大数据量排序
- 解决方案:读写分离 + 缓存策略 + 预聚合
十、总结与最佳实践
- 优化原则:先监控分析,再优化调整
- 优化顺序:架构 → 设计 → SQL → 配置
- 持续优化:建立性能监控体系,定期review