MySQL學習筆記(三)效能優化1

2021-06-05 07:15:31 字數 3020 閱讀 1942

mysql的資料庫鎖定分為表級鎖定,行級鎖定,頁級鎖定。innodb 儲存引擎和myisam 儲存引擎最大區別主要有四點,第一點是快取機制,第二點是事務支援,

第三點是鎖定實現,最後一點就是資料儲存方式的差異。

mysql的表級鎖定分為讀鎖定和寫鎖定,通過四個佇列來維護這兩周鎖定,分為當前鎖定的正在讀寫的佇列和當前正在等待的讀寫佇列:

• current read-lock queue (lock->read)

• pending read-lock queue (lock->read_wait)

• current write-lock queue (lock->write)

• pending write-lock queue (lock->write_wait)

讀鎖定:

當乙個客戶端在申請讀請求的時候,需要滿足兩個條件:

1、請求的讀鎖定資源沒有被寫鎖定;

2、被鎖定等待資源(pending write-lock queue)中沒有更高優先順序的鎖定

如果滿足上面兩個條件時,則將讀請求放入current read-lock queue佇列,如果沒有滿足條件時,則放入pending read-lock queue中等待資源釋放。

寫鎖定:

當乙個客戶端發出寫鎖定請求的時候,首先判斷current write-lock queue是否存在,不存在的話,再檢查pending write-lock queue,如果找到了,則進入pending write-lock queue,並暫停自身執行緒,如果沒有找到,則再檢查current read-lock queue,如果有鎖定存在,一樣需要等待。總結起來檢查的順序是:

current read-lock queue --> pending write-lock queue --> pending write-lock queue

優化:1.縮短鎖定時間,(拆分sql,建立索引,控制字段)

2.分離能並行的操作(併發插入特性concurrent_insert屬性)

3.合理利用讀寫優先順序

行級鎖定不是mysql自身實現的鎖定方式,而是由其他的儲存引擎如:innodb實現的,而innodb是目前事務型儲存引擎中使用最為廣泛的儲存引擎,它使用的是「next key locking」間隙鎖「,鎖定的是指向記錄的前乙個索引鍵和最後乙個索引鍵之間的空域,有下面幾個特點:

1.無法利用索引時,採用表級鎖定。

2.使用的索引鍵可能包含一些不被需要的值時,也會被鎖定。

3.使用索引定位資料的時候,索引鍵一樣但是資料行不同的時候,一樣會被鎖定。

優化:1.盡可能的使用索引,

2.合理設計索引

3.減少過濾條件

4.控制事務大小

1. 優化更需要優化的query;

2. 定位優化物件的效能瓶頸;

3. 明確的優化目標;

4. 從explain 入手;

5. 多使用profile

6. 永遠用小結果集驅動大的結果集;

7. 盡可能在索引中完成排序;

8. 只取出自己需要的columns;

9. 僅僅使用最有效的過濾條件;

10. 盡可能避免複雜的join 和子查詢;

建立索引的條件:

1.較頻繁作為插入條件的字段是和建立索引;

2.唯一性太差的字段不適合建立索引;(每個資料頁會存放多條記錄,頻繁的讀取不同的資料頁)

3.更新頻繁的資料不適合建立索引;

4.不會出現在where裡面的字段不適合建立索引

join語句的優化:

joinbuffer的概念,

1.盡可能減少join中巢狀迴圈的次數

2.優先優化內層迴圈

3.保證join條件欄位被索引

4.加大join buffer的設定

group by語句的優化:

1.使用鬆散索引掃瞄實現group by

如下圖所示:

這樣讀取數量與分組數量一致,但是有使用範圍:

(1).group by欄位必須是索引中最前面的位置;

(2).只能使用max和min兩個聚合函式

(3).引用別的欄位的時候必須以常量形式存在。

2.使用緊湊索引實現,

區別在於掃瞄索引時,讀取所有滿足條件的索引值,然後根據條件group by來得到結果

3.使用臨時表

1. 盡可能讓mysql 可以利用索引來完成group by 操作,當然最好是鬆散索引掃瞄的方式最佳。

在系統允許的情況下,我們可以通過調整索引或者調整query 這兩種方式來達到目的;

2. 當無法使用索引完成group by 的時候,由於要使用到臨時表且需要filesort,所以我們必須

要有足夠的sort_buffer_size 來供mysql 排序的時候使用,而且盡量不要進行大結果集的group

by 操作,因為如果超出系統設定的臨時表大小的時候會出現將臨時表資料copy 到磁碟上面再進行

操作,這時候的排序分組操作效能將是成數量級的下降;

distinct 實際上和group by 的操作非常相似,只不過是在group by 之後的每組中只取出一條記

錄而已。所以,distinct 的實現和group by 的實現也基本差不多,沒有太大的區別。同樣可以通過松

散索引掃瞄或者是緊湊索引掃瞄來實現,當然,在無法僅僅使用索引即能完成distinct 的時候,mysql

只能通過臨時表來完成。但是,和group by 有一點差別的是,distinct 並不需要進行排序。也就是

說,在僅僅只是distinct 操作的query 如果無法僅僅利用索引完成操作的時候,mysql 會利用臨時表

來做一次資料的「快取」,但是不會對臨時表中的資料進行filesort 操作

mysql高階之三效能分析

語法 explain sql語句 顯示的就是執行該語句的效能 結果顯示欄目錄 分別來介紹一下 id,告訴表的讀取順序 表示執行表的順序,同號按序,不同號,大的先執行。select type 告訴資料讀取操作型別,posible keys和key 分別表示系統中理論中有的索引,和實際所用的索引 key...

MySQL效能優化(1)

json型別 例項 mysql資料庫由後台執行緒及乙個共享記憶體區組成,資料庫例項才是真正用於運算元據庫檔案的程式集,是乙個動態概念。多例項就是在一台伺服器上同時開啟多個不同的資料庫服務埠 例如3306 3307 同時執行多個資料庫程序就是多例項。優點 充分利用伺服器資源。缺點 資源搶占問題。中小型...

MySQL學習筆記 查詢效能優化

查詢效能低下最根本的原因就是訪問的資料太多,大部分效能低下的查詢都可以通過減少訪問的資料量進行優化。一般有效的分析步驟如下 優化有問題的查詢時,目標應該是找到乙個更優的方法獲取實際需要的資料,而不是一定總是從mysql獲取一模一樣的結果集。優點 快取效率更高。許多應用程式可以方便地快取單錶查詢對應的...