入門只需三步走
1. 表和字段的規劃
- 字段長度的規劃要準確, 可以varchar(100) 就不要varchar(200), 過多浪費將會導致-----表聯查時佔用更多內存
- 字段儘量設置爲NOT NULL, 因爲值爲NULL會佔更多字節空間
- 儘量將定長字段放在一張表, 不定長字段放在另一張表, 用主鍵關聯起來
- 儘量選用定長字段, 這樣在運算和排序時速度更快
- 索引要命中關鍵點, 而且建索引時越少字段越好
- 時間和日期請用無符號的時間戳(int) , 避免用(data)
2. 前置分析
- 查詢已連接的全部會話, 判斷是否連接數佔滿
SELECT ID, USER, HOST, DB, COMMAND, TIME, STATE, INFO FROM information_schema.PROCESSLIST
- 查詢業務耗時記錄按從大到小排序 [前提是已設置
log_output=table
默認記錄在slow_log
表]
SELECT * FROM slow_log ORDER BY query_time DESC;
- 檢查某個語句的內存開銷 [進入mysql命令行模式]
# 先列出運行中的語句
show profiles;
# 然後根據Query_ID查詢內存開銷,假設要看Query_ID=5的那個語句
show profile Memory for query 5;
3. 重點分析和優化
-
查詢慢?
檢查where條件的索引命中率
縮小搜索的範圍, 儘量確定目標列而少用SELECT * -
單表數據量太大?
通過分表來降低索引的層數
考慮做讀寫分離 -
分頁查詢慢?
檢查limit是否有偏移, 正常來說是: 上一次查到第5萬,這一次應從第50001 ~ X -
加入了子查詢導致變慢?
儘量將子查詢替換爲關聯查詢, 但關聯也不宜過多[參考第7點
] -
複雜查詢慢?
儘量分拆爲單個查詢, 單個查詢的緩存利用率更大,並且減少了鎖的競爭 -
刪除大量數據很慢?
請使用分段刪除 -
關聯查詢慢?
拆分關聯爲多個單查詢, 然後將各個結果放在應用裏做關聯