MySQL 慢查詢(xún)是指執(zhí)行時(shí)間超過(guò)設(shè)定閾值的 SQL 語(yǔ)句,識(shí)別和優(yōu)化慢查詢(xún)是提升數(shù)據(jù)庫(kù)性能的關(guān)鍵。以下是關(guān)于慢查詢(xún)的配置、分析和優(yōu)化方法:
首先需要配置 MySQL 記錄慢查詢(xún),步驟如下:
登錄 MySQL 后執(zhí)行:
show variables like 'slow_query_log';
show variables like 'long_query_time';
編輯 MySQL 配置文件(my.cnf 或 mysqld.cnf),添加以下內(nèi)容:
[mysqld]
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 1 # 閾值,單位秒
log_queries_not_using_indexes = 1 # 記錄未用索引的查詢(xún)
log_output = FILE # 日志輸出到文件(默認(rèn))
修改后重啟 MySQL 服務(wù)生效。
慢查詢(xún)?nèi)罩靖袷绞纠?/div>
# Time: 230920 10:00:00
# User@Host: root[root] @ localhost [127.0.0.1]
# Query_time: 2.500 Lock_time: 0.000 Rows_sent: 1000 Rows_examined: 1000000
SELECT * FROM orders WHERE create_time < '2023-01-01';
關(guān)鍵參數(shù):
-
Query_time:執(zhí)行時(shí)間(秒)
-
Lock_time:鎖定時(shí)間
-
Rows_sent:返回行數(shù)
-
Rows_examined:掃描行數(shù)(越大越可能需要優(yōu)化)
MySQL 自帶的日志分析工具,可統(tǒng)計(jì)慢查詢(xún):
mysqldumpslow -s c -t 10 /var/log/mysql/mysql-slow.log
mysqldumpslow -s t -t 10 /var/log/mysql/mysql-slow.log
mysqldumpslow -g 'orders' /var/log/mysql/mysql-slow.log
參數(shù)說(shuō)明:
-
-s c:按查詢(xún)次數(shù)排序
-
-s t:按執(zhí)行時(shí)間排序
-
-t 10:顯示前 10 條
-
-g:正則匹配
-
pt-query-digest(Percona Toolkit):更強(qiáng)大的分析工具,支持按多種維度統(tǒng)計(jì)
-
MySQL Workbench:可視化分析慢查詢(xún)
-
為查詢(xún)條件的字段添加索引(如
WHERE、JOIN、ORDER BY后的字段)
CREATE INDEX idx_orders_create_time ON orders(create_time);
-
避免索引失效:
-
不在索引字段上做計(jì)算(如
WHERE YEAR(create_time) = 2023)
-
避免使用
NOT IN、!=、IS NULL等可能導(dǎo)致全表掃描的操作
-
避免
SELECT *,只查詢(xún)需要的字段
-
拆分復(fù)雜查詢(xún)?yōu)槎鄠(gè)簡(jiǎn)單查詢(xún)
-
用
JOIN代替子查詢(xún)(MySQL 5.5 + 對(duì) JOIN 優(yōu)化更好)
-
限制返回行數(shù)(使用
LIMIT)
-
示例:
SELECT * FROM orders WHERE user_id = 123;
SELECT id, order_no FROM orders WHERE user_id = 123 LIMIT 10;
-
大表分表(水平 / 垂直分表,見(jiàn)前文分表內(nèi)容)
-
優(yōu)化字段類(lèi)型(如用
INT代替BIGINT,VARCHAR(20)代替VARCHAR(255))
-
使用合適的存儲(chǔ)引擎(InnoDB 適合事務(wù),MyISAM 適合讀多寫(xiě)少場(chǎng)景)
-
調(diào)整
innodb_buffer_pool_size(建議設(shè)為系統(tǒng)內(nèi)存的 50%-70%)
-
增大
query_cache_size(適用于讀多寫(xiě)少場(chǎng)景,MySQL 8.0 已移除)
-
優(yōu)化連接數(shù)(
max_connections)
-
慢查詢(xún)閾值設(shè)置要合理(一般設(shè)為 1-3 秒,根據(jù)業(yè)務(wù)場(chǎng)景調(diào)整)
-
避免在生產(chǎn)環(huán)境頻繁開(kāi)啟
log_queries_not_using_indexes(可能產(chǎn)生大量日志)
-
定期分析慢查詢(xún)?nèi)罩荆ㄈ缑刻?/ 每周),及時(shí)發(fā)現(xiàn)性能問(wèn)題
-
優(yōu)化后需重新測(cè)試,確認(rèn)查詢(xún)性能提升
通過(guò)以上步驟,可以有效識(shí)別并解決 MySQL 慢查詢(xún)問(wèn)題,顯著提升數(shù)據(jù)庫(kù)響應(yīng)速度和整體性能。