MYSQL學習筆記 抖動一下

2021-10-08 22:22:26 字數 1905 閱讀 1351

有時在正常情況下,工作的很好的sql語句,突然就變慢了一下。mysql發生了抖動,這是什麼原因?

首先從mysql的wal機制說起。

innodb在處理更新語句的時候,只是寫了一次redo log就返回了。

那麼就會產生「脹頁」。當記憶體資料頁跟磁碟資料頁內容不一致的時候,我們稱這個記憶體頁為「髒頁」。記憶體資料寫入到磁碟後,記憶體和磁碟上的資料頁的內容就一致了,稱為「乾淨頁」。

產生了脹頁,就要找時間進行flush,把記憶體的資料刷入到磁碟裡面,保持資料的一致。

以賒賬的例子來看:

那麼發生mysql抖動一下的情況,可能就是在刷脹頁。

什麼情況下mysql會刷脹頁呢?

1 redo log滿了,那麼check point 就要往前移動。給redo long留出空間,同時會暫停所有的更新操作。

2 記憶體不夠用了,要留出記憶體給其他的資料頁使用,那麼如果淘汰的是脹頁,那麼就需要刷盤。

記憶體裡存在的,表示記憶體就是正確的資料,直接返回

記憶體裡不存在的,表示資料檔案裡面的就是正確的資料。讀入記憶體返回,

這樣做的效率最高。

3 只要當mysql認為系統空閒的時候,或者在系統忙的時候找個時間點刷一下盤

4 正常關閉mysql的時候

對效能的影響

第三是在系統空閒的時候,第四是正常關閉的時候,這兩種情況都不會產生效能問題。

第一種是在redo log寫滿的時候,這是所有的更新操作都不能進行,從監控看就是更新數跌到了0

第二種是常態,記憶體不夠用了,要先將髒頁寫到磁碟。innodb 用緩衝池(buffer pool)管理記憶體,緩衝池中的記憶體頁有三種狀態:

1 還沒有使用的;

2 使用了並且是乾淨頁;

3 使用了並且是髒頁。

innodb策略是會盡量的使用記憶體,當長時間使用的時候,沒有被使用的頁面是很少的。當需要讀取的資料頁不在記憶體的時候,就會在緩衝池申請乙個。那必然要把最長沒有使用到的頁面替換。如果是乾淨頁,那麼直接復用,如果是脹頁,那必須要刷入磁碟。

當:1 乙個查詢要淘汰的髒頁個數太多,會導致查詢的響應時間明顯變長;

2 日誌寫滿,更新全部堵住,寫效能跌為 0,這種情況對敏感業務來說,是不能接受的。

這都會影響效能。

控制策略

刷脹頁的數度影響的兩個因素:

1 脹頁的比例,不要超過75%,

脹頁的比例通過 innodb_buffer_pool_pages_dirty/innodb_buffer_pool_pages_total 得到。

mysql>

select variable_value into @a from global_status where variable_name =

'innodb_buffer_pool_pages_dirty'

;select variable_value into @b from global_status where variable_name =

'innodb_buffer_pool_pages_total'

;select @a/@b;

``

innodeb會根據脹頁的比例算出0-100範圍之間的陣列。	

2 redo log寫滿

演算法:

磁碟的iops會影響刷盤的速度。把innodb_io_capacity調成iops一樣

學習一下 spark kryo

property name default meaning spark.kryo.classestoregister none 如果您使用kryo序列化,請給出乙個以逗號分隔的自定義類名稱list列表,以向kryo註冊。有關更多細節,請參閱調優指南 tuning guide spark.kryo.r...

FocalLoss學習一下

0,會減少相對於好區分樣本 就是負樣本,也就是背景比較多的樣本 的損失,而將重心轉移到難區分的,而且比較容易誤分類的樣本 也就是正樣本 背景不會占太多,或者叫難負樣本 難區分的負樣本,一般資料集中它們的數量少 上面來。下面來具體理解下。當 概率值在0.6 1之間時,不管是 物體還是背景,置信度比較高...

mysql索引了解一下

索引是mysql中非常重要的知識,類似於書籍的目錄,可以提高檢索效率,降低資料庫的io成本。本文主要介紹最常用的b tree索引。b tree索引結構見上圖。最底下的是葉子節點,上層是非葉子節點。非葉子節點中存放鍵值和指向下層的指標 葉子節點存放鍵值和資料,存放的資料根據實現的不同而不同。例如 可以...