您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# MySQL中怎么优化慢查询
## 引言
在数据库运维和开发过程中,慢查询是影响系统性能的常见问题。当SQL语句执行时间超过预期阈值时,不仅会导致用户体验下降,还可能引发系统资源瓶颈。本文将深入探讨MySQL慢查询的优化策略,涵盖诊断工具、索引优化、SQL改写、配置调整等核心方法,帮助开发者系统性地解决性能问题。
---
## 一、识别慢查询
### 1.1 开启慢查询日志
```sql
-- 查看慢查询配置
SHOW VARIABLES LIKE 'slow_query%';
SHOW VARIABLES LIKE 'long_query_time';
-- 动态开启(重启失效)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 2; -- 单位:秒
SET GLOBAL slow_query_log_file = '/var/log/mysql/mysql-slow.log';
-- 永久生效需修改my.cnf
[mysqld]
slow_query_log = 1
long_query_time = 2
slow_query_log_file = /var/log/mysql/mysql-slow.log
EXPLN SELECT * FROM orders WHERE user_id = 100;
关键指标解读: - type:ALL(全表扫描)、index(索引扫描)、range(范围扫描)等 - key:实际使用的索引 - rows:预估扫描行数 - Extra:Using filesort(需要额外排序)、Using temporary(使用临时表)
mysqldumpslow -t 10 /var/log/mysql/mysql-slow.log
pt-query-digest /var/log/mysql/mysql-slow.log
-- 单列索引
ALTER TABLE users ADD INDEX idx_email (email);
-- 复合索引(注意最左前缀原则)
ALTER TABLE orders ADD INDEX idx_user_status (user_id, status);
-- 覆盖索引(查询只需访问索引)
SELECT user_id FROM orders WHERE status = 'paid';
WHERE YEAR(create_time) = 2023
WHERE user_id = '123'
(user_id为INT)WHERE name LIKE '%张'
-- 计算选择性(越接近1越好)
SELECT
COUNT(DISTINCT status)/COUNT(*) AS selectivity
FROM orders;
-- 反例(无索引条件)
SELECT * FROM products WHERE price > 10;
-- 正例(添加范围索引)
ALTER TABLE products ADD INDEX idx_price (price);
-- 确保关联字段有索引
ALTER TABLE orders ADD INDEX idx_user_id (user_id);
ALTER TABLE users ADD INDEX idx_id (id);
-- 小表驱动大表
SELECT * FROM small_table
JOIN large_table ON small_table.id = large_table.sid;
-- 反例(OFFSET效率低)
SELECT * FROM orders LIMIT 10000, 20;
-- 正例(使用游标)
SELECT * FROM orders WHERE id > 10000 LIMIT 20;
-- 只查询必要字段
SELECT id, name FROM users WHERE status = 1;
-- 按时间范围分区
CREATE TABLE logs (
id INT,
log_time DATETIME
) PARTITION BY RANGE (YEAR(log_time)) (
PARTITION p2022 VALUES LESS THAN (2023),
PARTITION p2023 VALUES LESS THAN (2024)
);
[mysqld]
# 缓冲池大小(通常设为物理内存的70-80%)
innodb_buffer_pool_size = 4G
# 连接数配置
max_connections = 500
thread_cache_size = 50
# 排序缓冲区
sort_buffer_size = 4M
join_buffer_size = 4M
-- 重建表索引
OPTIMIZE TABLE orders;
-- 更新统计信息
ANALYZE TABLE users;
-- 创建汇总表
CREATE TABLE order_summary (
user_id INT,
total_orders INT,
PRIMARY KEY (user_id)
);
-- 定期刷新数据
REPLACE INTO order_summary
SELECT user_id, COUNT(*) FROM orders GROUP BY user_id;
-- 原查询(OR导致索引失效)
SELECT * FROM products WHERE category = 'books' OR price < 50;
-- 优化为UNION
SELECT * FROM products WHERE category = 'books'
UNION
SELECT * FROM products WHERE price < 50;
SELECT * FROM orders USE INDEX (idx_user) WHERE user_id = 100;
实时监控工具:
建立基准测试:
sysbench oltp_read_write --db-driver=mysql prepare
定期检查清单:
MySQL慢查询优化是一个系统工程,需要结合具体业务场景进行分析。通过本文介绍的多层次优化方法,从SQL语句、索引设计到服务器配置,开发者可以建立起完整的性能优化体系。记住:没有放之四海而皆准的最优方案,持续的监控、测试和迭代才是保证数据库性能的关键。
最后修改:2023-11-15
字数统计:约2700字 “`
这篇文章采用Markdown格式编写,包含: 1. 结构化的小标题体系 2. 代码块展示SQL示例 3. 表格化参数说明 4. 命令行操作示例 5. 配置片段展示 6. 重点内容强调
可根据实际需要调整参数示例或增加特定数据库版本的注意事项。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。