參考自 極客時間 - 22 | mysql有哪些「飲鴆止渴」提高效能的方法?短連線:連線到資料庫執行很少sql後就被斷開。
在業務高峰期,可能會出現連線數暴漲的問題。
影響:mysql建立連線的成本很高,除了正常的網路連線三次握手外,還需要做登入許可權判斷和獲得這個連線的資料讀寫許可權。
如何識別不工作執行緒?
首先,使用show processlist
檢視連線狀態。例如
然後,識別空閒執行緒。
根據trx_mysql_thread_id
使用kill connection [id]
進行連線的關閉。
但是注意,此方法是業務有損的。
騷操作,跳過資料庫許可權驗證階段。
跳過許可權驗證的方法是:重啟資料庫,並使用–skip-grant-tables
引數啟動。這樣,整個 mysql 會跳過所有的許可權驗證階段,包括連線過程和語句執行過程在內。
在 mysql 8.0 版本裡,如果你啟用–skip-grant-tables
引數,mysql 會預設把--skip-networking
引數開啟,表示這時候資料庫只能被本地的客戶端連線。
效能問題的查詢sql的原因大致如下:
索引沒有設計好。
查詢語句沒有寫好。
mysql選錯索引。
可以嘗試直接加索引,5.6以上支援online ddl,比較高效;
備選方案:假設資料庫為一主(a)一備(b)。
在備庫 b 上執行 set sql_log_bin=off,也就是不寫 binlog,然後執行 alter table 語句加上索引;
執行主備切換;
這時候主庫是 b,備庫是 a。在 a 上執行set sql_log_bin=off
,然後執行 alter table 語句加上索引。
實際不緊急場景,可以考慮使用gh-ost進行online ddl。
預防方案(檢測sql執行時長):
上線前,在測試環境,把慢查詢日誌(slow log)開啟,並且把 long_query_time 設定成 0,確保每個語句都會被記錄入慢查詢日誌;
在測試表裡插入模擬線上的資料,做一遍回歸測試;
如果新增的 sql 語句不多,手動跑一下就可以。而如果是新專案的話,或者是修改了原有專案的 表結構設計,全量回歸測試都是必要的。這時候,你需要工具幫你檢查所有的 sql 語句的返回結果。比如,你可以使用開源工具 pt-query-digest(
如果是bug導致qps過高,可以單獨下掉對應功能的資料庫使用者。
或者call query_rewrite.flush_rewrite_rules()
直接重寫"select 1"返回
MySQL資料庫臨時提高效能的方法
連線數量超過max connections時,新來的連線會被拒絕。這時有一些臨時解決辦法 注意這些辦法都是有損的 kill掉那些占用連線但未進行事務操作的執行緒,注意如果資料庫端主動斷開連線,客戶端是不能立刻感知的。讓資料庫建立連線時跳過許可權驗證階段,重啟資料庫,並使用 skip grant ta...
SQL 提高效能
參考部落格 非常感謝博主分享。1.set nocount on 關閉行基數資訊,減少網路通訊,提高程式效能。2.count 1 count 2 count name count 前三種效果一樣,count 找出最短的列,所以建議用count 1 效率高。3.with nolock 大量的查詢,會導致...
MySQL基礎 大幅度提高效能方案,分割槽表
下面就筆者工作中遇到的時間問題,模擬一下情況對大家進行介紹.工作中仍然是海量資料出現的情況.每年大概會有幾億條記錄.而且資料的時效性比較強.但歷史資料仍然要求保留.這個時候經過分析和研究,最終決定通過時間字段進行分割槽.下面是分割槽表的建立 讀者門在插入了不同年份時間段以後,可以時間欄位為條件進行查...