MySQL調優 優化需要考慮哪些方面
優化目標與方向定位
-
總體目標:使得回應時間更快,吞吐量更大, (throughout --- 吞吐量:單位時間內處理事務的數量)
-
如何找到需要優化的地方
-
使用反饋,比如做出一些操作后導致效率降低
-
分析日志,
-
監控服務器資源,系統,記憶體,I/O
-
監控資料庫運行狀況
-
可優化維度
設計優化
- 選擇適合的DBMS
- 對表恰當的設計
- 盡量遵循第三范式,減少冗余的同時減少增刪改時出錯的可能,
- 適當地"反范式",以空間換時間,提高多表聯查的效率,
- 選擇恰當的欄位型別,盡量選擇資料型別,盡量選擇字符長度小的字符型別,
查詢優化
- 對SQL查詢進行邏輯優化 --- 就是使用恰當的SQL陳述句讓查詢速度更快
- 比如“小表驅動大表”的EXISTS和IN
- 比如子查詢優化,簡化查詢條件等等
- 對SQL查詢進行物理優化 --- 就是通過索引或表鏈接的方式進行優化,本質上是對Server層優化器和執行器進行“人工輔助”,人為地減輕優化器和執行器的壓力,
- 索引
- 為表設計精簡且高效的索引 --- 索引不是越多越好,索引需要占據存盤空間,過多的索引也會提高優化器選擇索引的難度,比如欄位內資料重復度高時不建立索引,如性別
- 若在where中對索引欄位進行了運算式計算,會造成該欄位索引失效,
- 設計聯合索引時選擇恰當的順序 --- 最左前綴原則
- 表連接
- 單表:全表掃描或區域掃描
- 兩表:合并連接,HASH連接,嵌套回圈連接
- 多表:連接順序
- 索引
外置快取
資料都是存放在資料庫(磁盤)中的,在有使用需要的時候就會將磁盤資料調入記憶體,但當用戶量增大時,使用大量資料,頻繁讀取磁盤會消耗大量資源,因此我們可以事先將常用的資料放入記憶體中來提高查詢效率,
- 鍵值存盤資料庫 Redis 和 Memcached 等
- Redis 支持持久化且支持的資料型別和資料結構比Memcached多,Memcached僅進行記憶體存盤且僅支持鍵值對存盤,
- 對于查詢回應要求高的場景可以考慮上述記憶體資料庫,不過增加的開發人員的作業量,
庫級優化
一般來說現在常見的關系型資料庫單表可以存盤億級的資料量,
當資料量達到億級以上時可以采用以下方案進行庫級優化,
- 讀寫分離:使用主從資料庫代替單一資料庫,降低單一資料庫時的負載,主庫完成寫操作,從庫完成讀操作,
- 分庫分表
- 垂直切分
- 垂直分庫:資料表過多時,對表進行劃分,將相關聯的資料表存放在一個庫中
- 垂直分表:資料表列較多時,對列進行劃分并拆分成多個表,將經常一起使用的列存入一張表中
- 水平切分
- 表中資料量達到億級以上時,在保持相同的表結構的情況下,將表按照某一屬性拆分成不同小表,
- 垂直切分
- 分庫分表也會增加維護和使用成本,要加以平衡,
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/16379.html
標籤:MySQL
上一篇:MySQL學習筆記(9):索引
下一篇:更新多張表中同樣欄位內的值
