Mysql的表優化和性能排查 [入門篇]

1. 表和字段的規劃

  1. 字段長度的規劃要準確, 可以varchar(100) 就不要varchar(200), 過多浪費將會導致-----表聯查時佔用更多內存
  2. 字段儘量設置爲NOT NULL, 因爲值爲NULL會佔更多字節空間
  3. 儘量將定長字段放在一張表, 不定長字段放在另一張表, 用主鍵關聯起來
  4. 儘量選用定長字段, 這樣在運算和排序時速度更快
  5. 索引要命中關鍵點, 而且建索引時越少字段越好
  6. 時間和日期請用無符號的時間戳(int) , 避免用(data)

2. 前置分析

  1. 查詢已連接的全部會話, 判斷是否連接數佔滿
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM information_schema.PROCESSLIST
  1. 查詢業務耗時記錄按從大到小排序 [前提是已設置 log_output=table 默認記錄在slow_log表]
SELECT * FROM slow_log ORDER BY query_time DESC;
  1. 檢查某個語句的內存開銷 [進入mysql命令行模式]
# 先列出運行中的語句
show profiles;

# 然後根據Query_ID查詢內存開銷,假設要看Query_ID=5的那個語句
show profile Memory for query 5;

3. 重點分析和優化

  1. 查詢慢?
    檢查where條件的索引命中率
    縮小搜索的範圍, 儘量確定目標列而少用SELECT *

  2. 單表數據量太大?
    通過分表來降低索引的層數
    考慮做讀寫分離

  3. 分頁查詢慢?
    檢查limit是否有偏移, 正常來說是: 上一次查到第5萬,這一次應從第50001 ~ X

  4. 加入了子查詢導致變慢?
    儘量將子查詢替換爲關聯查詢, 但關聯也不宜過多[參考第7點]

  5. 複雜查詢慢?
    儘量分拆爲單個查詢, 單個查詢的緩存利用率更大,並且減少了鎖的競爭

  6. 刪除大量數據很慢?
    請使用分段刪除

  7. 關聯查詢慢?
    拆分關聯爲多個單查詢, 然後將各個結果放在應用裏做關聯

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章