14.sql執行突然變慢的原因,有時候,一條語句執行很快,有時候又執行很慢。
mysql在執行更新操作的時候,寫磁碟的時候,是寫的redolog和記憶體,寫完就返回更新成功, 此時資料檔案並沒有被更新。
記憶體資料和磁碟資料就不一致,這時候記憶體頁也叫髒頁,記憶體資料寫入到磁碟之後,這個時候記憶體資料頁就叫乾淨頁,
這個過程叫flush 。
執行的很快的時候就是寫記憶體和日誌,執行的很慢的時候就是在flush。
flush的場景
1.當redolog的空間用完了,mysql就會停止所有的更新操作,把checkpoiont指標向前推進,留出來空間。
但是這個指標推進的前提是,將這段區間內對應的記憶體髒頁都flush到磁碟資料裡面。
2.當記憶體不夠的時候,需要淘汰掉一部分不用的記憶體資料,然後載入新的資料,這時候如果淘汰的是髒頁,那麼需要將髒頁寫到磁碟中,再淘汰。
這樣可以確保,如果記憶體中有資料,那麼資料中就是最新的,如果記憶體中沒有,那麼磁碟中的資料就是最新的。
3.空閒的時候,系統自己慢慢把髒頁flush到磁碟中。
4.mysql關閉的時候,也會將此時記憶體中的髒頁都flush到磁碟中。
其中3 和4 對效能無影響。
1是致命的,一旦redolog用完了,就會將更新全部停掉,等待flush完成。應當盡量避免,
2是常態,淘汰資料是將最久沒使用的資料頁淘汰掉,但是如果乙個查詢要淘汰太多的髒頁,會使得查詢時間變長,因為每乙個髒頁淘汰之前都要將資料flush到磁碟上。
避免1和2影響效能的關鍵在於,控制flush的速度,如果太慢了,就會導致redolog不夠或者記憶體髒頁太多,太快了又會導致頻繁寫磁碟。
innodb參照髒頁比例和redolog的寫盤速度,兩個因素控制刷盤的速度。
innodb還有乙個策略,就是在flush乙個髒頁時,發現這個資料頁旁邊的也是髒頁,也會將旁邊的這個髒頁也flush掉,而且這個機制是會「傳染」的,也就是這個髒頁的旁邊也是髒頁,那也會一起被flush。 這個策略在機械硬碟的時代有很大提公升,減少了隨機io次數,但是現在都是固態硬碟,也就沒那麼大的必要。因此,在 mysql 8.0 中,innodb_flush_neighbors 引數的預設值已經是 0 了。
注意:如果redolog設定的很小,那麼體現出來的就是磁碟壓力很小,但是資料庫效能出現間歇性**。
mysql執行語句 mysql執行sql語句過程
流程概述 mysql得到sql語句後,大概流程如下 1.sql的解析器 負責解析和 sql 2.預處理器 對解析後的sql樹進行驗證 3.查詢優化器 得到乙個執行計畫 4.查詢執行引擎 得到資料結果集 5.將資料放回給呼叫端。流程圖如下所示 分發器及快取階段 首先,如果系統的快取功能開啟著的話,sq...
mysql筆記系列 十二 count的執行過程
myisam 將乙個表的總行數存在了磁碟裡面,使用的時候直接讀出來,很快。如果有where 條件,就需要按行統計了,就不能那麼快 innodb則是將資料一條條讀出來統計,所以資料越多越慢。innodb這樣設計是因為事務,事務的併發版本控制,乙個事務中的查詢,只能對看到自己事務隔離級別的資料,也就需要...
mysql執行sql檔案
mysql uspider 55haitao pspider 55haitao dspider 55haitao方法一使用cmd命令執行 windows下,unix或linux在的其控制台下 mysql的bin目錄 mysql u使用者名稱 p密碼 d資料庫 sql指令碼檔案路徑全名 示例 d my...