Mysql高效能總結
Mysql架構和歷史
邏輯架構
併發控制
鎖分類:
共享鎖 讀鎖
排它鎖 寫鎖
鎖策略:
表級鎖
行級鎖
注:儲存引擎自己實現鎖機制
事務
ACID理解:原子性、一致性、隔離性、永續性
隔離級別:
RU(讀未提交):髒讀、不可重複讀、幻讀
RC(讀已提交):不可重複讀、幻讀
RR(可重複讀):幻讀
S(可序列化):加鎖讀
注:Mysql預設隔離級別為:RR,通過mvcc(多版本控制)解決幻讀
事務是由儲存引擎實現的
死鎖
死鎖是兩個或多個事務在同一資源上相互佔用,並請求鎖定對方佔用的資源,從而導致惡性迴圈的現象。
注:Innodb處理死鎖的方法是,將持有最少行級排它鎖的事務進行回滾
資料型別與Schema優化
資料型別的選擇
-
- 更小的通常更好
- 簡單更好
- 儘量避免NULL
舉例:
使用Mysql內建的型別而不是字串儲存日期和時間
用整型儲存IP地址
儘量避免使用null,索引欄位不能為NULL
DATETIME和TIMESTAMP的區別
Schema的設計
避免太多的列(寬表)
避免太多的關聯
列舉少用
儘量避免使用null
正規化和反正規化相結合
建立高效能的索引
在mysql中索引是在儲存引擎層而不是在伺服器層實現的,且各儲存引擎對相同索引的實現也不一樣
資料和索引的統計資訊放在儲存引擎中
索引分類
底層實現:
B-Tree索引
雜湊索引
…
功能:
主鍵索引
普通索引
唯一索引
組合索引
索引的優點
-
- 大大減少了伺服器需要掃描的資料量
- 可以幫助伺服器避免排序和臨時表
- 可以將隨機I/O變為順序I/O
索引策略
獨立的列(不能是表示式的一部分或函式的引數)
最左字首和索引選擇性
聚簇索引
覆蓋索引
使用索引掃描來做排序
冗餘和重複索引
索引和鎖
InnoDB在二級索引上使用共享(讀)鎖,但在主鍵索引上使用排它(寫)鎖
總結
單行訪問是很慢的
按順序訪問範圍資料是很快的
索引覆蓋查詢是很快的
查詢效能優化
優化資料訪問
是否向資料庫請求了不需要的資料
是否在掃描額外的記錄
重構查詢的方式
複雜查詢or多個簡單查詢
切分查詢
分解關聯查詢
查詢執行的基礎
- Mysql客戶端/服務端通訊協議
半雙工
查詢狀態 Show full processlist
Sleep:
Query:
Locked:
Analyzing and statistics:
Copying to tmp table:
Sorting result:
Sending data:
- 查詢快取
通過對一個大小寫敏感的雜湊查詢實現的
- 查詢優化處理
語法解析器:校驗語法
前處理器:校驗欄位、
查詢優化器:將語法樹轉化成執行計劃,是一個很複雜的過程
- 查詢執行引擎
- 返回結果給客戶端
查詢優化器的侷限性
查詢優化器的提示
優化特定型別的查詢
未完待續
轉載於:https://my.oschina.net/jzgycq/blog/1931880