# 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]
# 緩沖池大?。ㄍǔTO為物理內存的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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。