1.1 定义:MySQL数据库优化是指通过合理配置、结构优化、查询优化等手段,提高数据库系统的性能、可靠性和安全性的过程。
1.2 核心原则:
关键指标
监控工具
sqlset global slow_query_log = 1;
set global long_query_time = 1; -- 设置阈值为1秒
分析工具
关注指标
最左前缀原则
索引选择性
避免过度索引
场景描述: 用户表按照年龄、城市、注册时间频繁查询
优化前:
sqlCREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
city VARCHAR(50),
register_time DATETIME,
INDEX idx_age (age),
INDEX idx_city (city),
INDEX idx_register (register_time)
);
优化后:
sqlCREATE TABLE users (
id INT PRIMARY KEY,
name VARCHAR(50),
age INT,
city VARCHAR(50),
register_time DATETIME,
INDEX idx_age_city_register (age, city, register_time)
);
效果分析:
避免全表扫描
减少数据访问
优化JOIN操作
1. 性能瓶颈分析
2. 优化方案对比
sql-- 优化前:全表扫描代价高
SELECT * FROM orders ORDER BY create_time DESC LIMIT 100000, 10;
-- 优化后:通过延迟关联减少数据访问量
SELECT o.* FROM orders o
INNER JOIN (
SELECT id FROM orders
ORDER BY create_time DESC
LIMIT 100000, 10
) b ON o.id = b.id;
优点:
sql-- 基于上次分页的最后一条记录进行查询
SELECT * FROM orders
WHERE create_time < '2023-12-01 12:00:00'
ORDER BY create_time DESC
LIMIT 10;
优点:
缺点:
sql-- 根据主键范围进行分页
SELECT * FROM orders
WHERE id > 100000
ORDER BY id
LIMIT 10;
优点:
缺点:
3. 实践建议
#### 4.2.2 IN子查询优化 ```sql -- 优化前 SELECT * FROM orders WHERE user_id IN (SELECT id FROM users WHERE age > 25); -- 优化后 SELECT o.* FROM orders o INNER JOIN users u ON o.user_id = u.id WHERE u.age > 25;
内存相关
并发相关
场景描述: 大型电商平台,日订单量100万+,数据库响应延迟
优化措施:
iniinnodb_buffer_pool_size = 32G
innodb_buffer_pool_instances = 8
innodb_log_file_size = 4G
innodb_log_buffer_size = 16M
inimax_connections = 2000
innodb_thread_concurrency = 0
thread_cache_size = 64
优化效果:
实现方式
注意事项
分库策略
分表策略
某电商平台订单查询接口响应慢,影响用户体验
问题定位
优化方案
具体措施
sql-- 添加复合索引
ALTER TABLE orders ADD INDEX idx_user_time (user_id, create_time);
-- 优化查询SQL
SELECT o.*, oi.product_name
FROM orders o
FORCE INDEX (idx_user_time)
LEFT JOIN order_items oi ON o.id = oi.order_id
WHERE o.user_id = ?
ORDER BY o.create_time DESC
LIMIT 10;
性能提升
经验总结
定期维护
性能基准
本文作者:大哥吕
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!