1. 程式人生 > 實用技巧 >Mysql高效能總結

Mysql高效能總結

>>> hot3.png

Mysql架構和歷史

邏輯架構

併發控制

鎖分類:

共享鎖 讀鎖

排它鎖 寫鎖

鎖策略:

表級鎖

行級鎖

注:儲存引擎自己實現鎖機制

事務

ACID理解:原子性、一致性、隔離性、永續性

隔離級別:

RU(讀未提交):髒讀、不可重複讀、幻讀

RC(讀已提交):不可重複讀、幻讀

RR(可重複讀):幻讀

S(可序列化):加鎖讀

注:Mysql預設隔離級別為:RR,通過mvcc(多版本控制)解決幻讀

事務是由儲存引擎實現的

死鎖

死鎖是兩個或多個事務在同一資源上相互佔用,並請求鎖定對方佔用的資源,從而導致惡性迴圈的現象。

注:Innodb處理死鎖的方法是,將持有最少行級排它鎖的事務進行回滾

資料型別與Schema優化

資料型別的選擇

    1. 更小的通常更好
    2. 簡單更好
    3. 儘量避免NULL

舉例:

使用Mysql內建的型別而不是字串儲存日期和時間

用整型儲存IP地址

儘量避免使用null,索引欄位不能為NULL

DATETIME和TIMESTAMP的區別

Schema的設計

避免太多的列(寬表)

避免太多的關聯

列舉少用

儘量避免使用null

正規化和反正規化相結合

建立高效能的索引

在mysql中索引是在儲存引擎層而不是在伺服器層實現的,且各儲存引擎對相同索引的實現也不一樣

資料和索引的統計資訊放在儲存引擎中

索引分類

底層實現:

B-Tree索引

雜湊索引

功能:

主鍵索引

普通索引

唯一索引

組合索引

索引的優點

    1. 大大減少了伺服器需要掃描的資料量
    2. 可以幫助伺服器避免排序和臨時表
    3. 可以將隨機I/O變為順序I/O

索引策略

獨立的列(不能是表示式的一部分或函式的引數)

最左字首和索引選擇性

聚簇索引

覆蓋索引

使用索引掃描來做排序

冗餘和重複索引

索引和鎖

InnoDB在二級索引上使用共享(讀)鎖,但在主鍵索引上使用排它(寫)鎖

總結

單行訪問是很慢的

按順序訪問範圍資料是很快的

索引覆蓋查詢是很快的

查詢效能優化

優化資料訪問

是否向資料庫請求了不需要的資料

是否在掃描額外的記錄

重構查詢的方式

複雜查詢or多個簡單查詢

切分查詢

分解關聯查詢

查詢執行的基礎

  1. Mysql客戶端/服務端通訊協議

半雙工

查詢狀態 Show full processlist

Sleep:

Query:

Locked:

Analyzing and statistics:

Copying to tmp table:

Sorting result:

Sending data:

  1. 查詢快取

通過對一個大小寫敏感的雜湊查詢實現的

  1. 查詢優化處理

語法解析器:校驗語法

前處理器:校驗欄位、

查詢優化器:將語法樹轉化成執行計劃,是一個很複雜的過程

  1. 查詢執行引擎

  1. 返回結果給客戶端

查詢優化器的侷限性

查詢優化器的提示

優化特定型別的查詢

未完待續

轉載於:https://my.oschina.net/jzgycq/blog/1931880