有時在正常情況下,工作的很好的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索引結構見上圖。最底下的是葉子節點,上層是非葉子節點。非葉子節點中存放鍵值和指向下層的指標 葉子節點存放鍵值和資料,存放的資料根據實現的不同而不同。例如 可以...