宝塔山 发表于 2025-4-8 23:14:05

MySQL性能优化实战技巧:让你的数据库飞起来

目次

一、性能优化的核心思路
二、诊断性能题目
1. 慢查询日志分析(实战设置)
2. EXPLAIN实验计划解读
三、索引优化实战
1. 索引失效的六大场景
2. 复合索引设计技巧
3. 覆盖索引优化
四、SQL语句优化技巧
1. 分页查询优化
2. 关联查询优化
五、架构设计优化
1. 读写分离设置
2. 分库分表实战
六、参数调优实战
1. InnoDB核心参数
2. 毗连数优化
七、高级优化技巧
1. 热点更新优化
2. 死锁预防策略
八、性能监控体系
1. 实时监控下令
2. Prometheus+Granafa监控体系
九、实战优化案例
案例:电商订单查询优化
十、总结与建议

一、性能优化的核心思路


[*] 减少数据访问量:减少磁盘IO和网络传输
[*] 降低计算复杂度:优化查询逻辑和算法
[*] 公道利用资源:最大化利用内存、CPU和缓存
[*] 预防优于治疗:通过监控提前发现题目

二、诊断性能题目

1. 慢查询日志分析(实战设置)

-- 开启慢查询日志
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1; -- 超过1秒的查询
SHOW VARIABLES LIKE '%slow_query%'; 2. EXPLAIN实验计划解读

EXPLAIN SELECT * FROM orders
WHERE user_id IN (SELECT id FROM users WHERE age > 30); 关键字段解读:
   

[*] type:ALL(全表扫描)、index(索引扫描)、range(范围扫描)
[*] rows:预估扫描行数
[*] Extra:Using filesort(必要额外排序)、Using temporary(利用临时表)
三、索引优化实战

1. 索引失效的六大场景

-- 案例1:隐式类型转换
SELECT * FROM users WHERE phone = 13800138000; -- phone是varchar类型

-- 案例2:前导通配符查询
SELECT * FROM logs WHERE url LIKE '%error%';

-- 案例3:对索引列进行运算
SELECT * FROM orders WHERE YEAR(create_time) = 2023; 2. 复合索引设计技巧

最佳实践:
-- 创建合理的复合索引
ALTER TABLE orders ADD INDEX idx_composite (user_id, status, create_time);

-- 索引使用顺序遵循最左匹配原则:
WHERE user_id = 1 AND status = 'paid' -- 有效
WHERE status = 'paid' AND create_time > '2023-01-01' -- 无效 3. 覆盖索引优化

-- 原始查询(需要回表)
SELECT * FROM products WHERE category = 'electronics';

-- 优化为覆盖索引:
ALTER TABLE products ADD INDEX idx_cover (category, name, price);
SELECT category, name, price FROM products WHERE category = 'electronics'; 四、SQL语句优化技巧

1. 分页查询优化

传统分页的题目:
SELECT * FROM orders ORDER BY id LIMIT 1000000, 10; -- 越往后越慢 优化方案:
-- 方案1:记录上次查询位置
SELECT * FROM orders WHERE id > 1000000 ORDER BY id LIMIT 10;

-- 方案2:子查询优化
SELECT * FROM orders
WHERE id >= (SELECT id FROM orders ORDER BY id LIMIT 1000000, 1)
LIMIT 10; 2. 关联查询优化

错误示例:
SELECT * FROM users
WHERE id IN (SELECT user_id FROM orders WHERE amount > 1000); -- 嵌套查询效率低 优化方案:
-- 使用JOIN代替子查询
SELECT users.* FROM users
JOIN orders ON users.id = orders.user_id
WHERE orders.amount > 1000
GROUP BY users.id; -- 避免重复数据 五、架构设计优化

1. 读写分离设置

https://i-blog.csdnimg.cn/direct/70674bccbd734d118a0bf16a5f06ceff.png
设置要点:
   

[*] 主库负责写操纵(binlog同步)
[*] 从库通过SHOW SLAVE STATUS监控同步延迟
[*] 利用中心件(MyCat/ProxySQL)自动路由
2. 分库分表实战

垂直拆分:
-- 用户表拆分
CREATE TABLE user_base (
    id INT PRIMARY KEY,
    username VARCHAR(50),
    password VARCHAR(100)
);

CREATE TABLE user_profile (
    user_id INT PRIMARY KEY,
    age INT,
    address TEXT
); 水平拆分方案:
   

[*] 按时间范围:2023_q1_orders, 2023_q2_orders
[*] 按哈希值:user_0, user_1, ..., user_7(8个分片)
六、参数调优实战

1. InnoDB核心参数

# my.cnf配置示例

innodb_buffer_pool_size = 16G# 建议设置物理内存的70%-80%
innodb_log_file_size = 2G      # 大事务需要增加日志大小
innodb_flush_log_at_trx_commit = 2# 平衡安全性与性能 2. 毗连数优化

-- 查看连接状态
SHOW STATUS LIKE 'Threads_connected';

-- 推荐配置
max_connections = 2000
thread_cache_size = 100
wait_timeout = 300 七、高级优化技巧

1. 热点更新优化

题目场景:计数器频繁更新
UPDATE article SET view_count = view_count + 1 WHERE id = 123; 优化方案:
-- 使用中间值表
CREATE TABLE article_counter (
    article_id INT PRIMARY KEY,
    count INT
);

-- 定期同步到主表
UPDATE article a
JOIN article_counter c ON a.id = c.article_id
SET a.view_count = a.view_count + c.count; 2. 死锁预防策略

   

[*] 保持变乱短小
[*] 按固定序次访问多个表
[*] 利用SELECT ... FOR UPDATE明确锁定范围
八、性能监控体系

1. 实时监控下令

SHOW ENGINE INNODB STATUS;   -- 查看锁/事务信息
SHOW PROCESSLIST;            -- 查看当前连接
SHOW GLOBAL STATUS LIKE 'Innodb_row_lock%'; -- 行锁统计 九、实战优化案例

案例:电商订单查询优化

原始题目:
SELECT * FROM orders
WHERE user_id = 123
AND status IN (1,2,3)
ORDER BY create_time DESC
LIMIT 10; -- 执行时间2.8秒 优化步骤:
   
[*] 创建复合索引:(user_id, status, create_time)
[*] 利用覆盖索引:
SELECT id, user_id, status, create_time
FROM orders
WHERE user_id = 123
AND status IN (1,2,3)
ORDER BY create_time DESC
LIMIT 10; -- 优化后0.02秒
十、总结与建议

   
[*] 优化序次:SQL语句 > 索引 > 架构 > 参数
[*] 黄金法则:避免全表扫描、减少临时表、利用批处理
[*] 连续改进:创建性能基线,定期进行压力测试

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: MySQL性能优化实战技巧:让你的数据库飞起来