MySQL -- 短連線 + 慢查詢
-
max_connections
:MySQL例項同時存在的連線數上限 - 當連線數超過
max_connections
,系統會 拒絕 接下來的連線請求,返回:Too many connections
- 當連線被拒絕,從業務角度來看是 資料庫不可用
- 如果機器 負載較高 ,處理現有請求的時間會變長,每個連線 保持的時間 也會變長
- 如果再有新建連線的話,很容易觸發
max_connections
的限制
- 如果再有新建連線的話,很容易觸發
-
max_connections
的目的是 保護MySQL 的- 如果把
max_connections
設定得過大,更多的連線就會進來,導致系統負載會進一步加大 - 大量的資源會耗費在 許可權驗證 等邏輯上,而已經 拿到連線的執行緒 會搶不到CPU資源去執行業務SQL
- 如果把
mysql> SHOW VARIABLES LIKE '%max_connections%'; +-----------------+-------+ | Variable_name| Value | +-----------------+-------+ | max_connections | 2000| +-----------------+-------+
清理Sleep狀態的連線
KILL CONNECTION
:主動踢除 不需要保持 的連線(與 wait_timeout
的效果一樣)
時刻 | sission A | session B | session C |
---|---|---|---|
T | BEGIN; INSERT INTO t VALUES (1,1); |
SELECT * FROM t WHERE id=1; | |
T+30s | SHOW PROCESSLIST; KILL CONNECTION |
- 踢除
Sleep
狀態的連線是 有損 的 - 如果斷開sission A的連線,會 回滾事務
- 如果斷開sission B的連線,沒有任何影響
- 優先斷開 事務外空閒 的連線
- 再考慮斷開 事務內空閒 的連線
事務外空閒

trx_mysql_thread_id
: id=4
的執行緒還處在事務中

KILL CONNECTION
- 服務端執行
KILL CONNECTION id
,如果連線在此前處於Sleep
狀態,客戶端是 不會立馬知道 - 客戶端如果發起 下一個請求 ,報錯
ERROR 2006 (HY000): MySQL server has gone away
- 因此,客戶端(應用層)需要有 重連機制
減少連線過程的消耗
- 資料庫 跳過許可權驗證階段 – 風險極高
- 重啟資料庫,啟動引數
--skip-grant-tables
- 跳過 所有 的許可權驗證階段( 連線過程 + 語句執行過程 )
- 重啟資料庫,啟動引數
- 從MySQL 8.0開始,啟用
--skip-grant-tables
引數,預設會啟用--skip-networking
( 本地客戶端 )
慢查詢
索引沒有設計好
古老方案
-
Online DDL
–ALTER TABLE
- 主庫A,備庫B
- 在備庫B上執行
SET sql_log_bin=OFF
( 不寫binlog ),ALTER TABLE
加上索引 - 執行 主備切換 ,變成主庫B,備庫A
- 在備庫A上執行
SET sql_log_bin=OFF
( 不寫binlog ),ALTER TABLE
加上索引
工具
gh-ost
語句沒寫好
-- Since MySQL 5.7 INSERT INTO query_rewrite.rewrite_rules (pattern, replacement, pattern_database) VALUES ("SELECT * FROM t WHERE id + 1 = ?", "SELECT * FROM t WHERE id = ? - 1", "test"); CALL query_rewrite.flush_rewrite_rules();
MySQL選錯索引
-
FORCE INDEX
-
query_rewrite
+FORCE INDEX
預先發現問題
- 測試環境配置:
slow_query_log=ON
+long_query_time=0
- SQL Review,留意
Rows_examined
是否與預期的一致 - 工具:
pt-query-digest
參考資料
《MySQL實戰45講》
轉載請註明出處:http://zhongmingmao.me/2019/02/20/mysql-short-conn-slow-query/
訪問原文「 MySQL -- 短連線 + 慢查詢 」獲取最佳閱讀體驗並參與討論