亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

MySQL性能突然下降的原因

 更新時間:2020年10月13日 11:37:17   作者:以終為始  
這篇文章主要介紹了MySQL性能突然下降的原因,幫助大家更好的了解和維護數(shù)據(jù)庫,感興趣的朋友可以了解下

有時會碰到這樣的情況,一條 SQL 在平時執(zhí)行沒問題,很快。但是突然某個時間執(zhí)行的就會很慢,而且這種場景并不能復現(xiàn),只能隨機發(fā)送的。

SQL 執(zhí)行突然變慢的原因

在之前講解 MySQL Redo log 時,說到了 WAL 機制,為了保證 MySQL 更新的速度,在進行更新操作時,先將更新內容寫入 redo log,后續(xù)系統(tǒng)空閑時,再將 redo log 的內容應用到磁盤。

當內存數(shù)據(jù)頁(redo log)和磁盤數(shù)據(jù)頁內容不一致時,將該內存也稱為 “臟頁”。將內存數(shù)據(jù)寫入到磁盤后,數(shù)據(jù)一致,內存頁稱為 "干凈頁"。

在內存數(shù)據(jù)寫入磁盤時,這個過程稱為 flush 過程。SQL 突然執(zhí)行變得很慢,性能下降。原因就可能和 flush 操作有關。

因為在進行 flush 操作時,更新操作會等待 redo log 的寫入。

引起 flush 操作的原因

場景一:redo log 日志已經記滿。這時系統(tǒng)會停止更新操作,將 check point 向前推進,讓 redo log 留出空間可以繼續(xù)寫。

這里假設 CP 到 CP‘ 間隙已經寫入到磁盤,這部分就變成了干凈頁,此時 write pos 就可以寫入這部分區(qū)域了。

場景二:系統(tǒng)內存不足,需要新的內存頁時,發(fā)現(xiàn)內存不夠用了,就需要淘汰一些數(shù)據(jù)頁。如果淘汰時,這時數(shù)據(jù)頁時臟頁,就要將臟頁寫到磁盤。

這時有個問題是,命名 redo log 中的內容已經被記錄到日志中了,假如內存滿了,直接刪除不就可以嗎?下次讀入時,再把 redo log 日志中的內容應用到磁盤。

沒有選擇直接清空內存,是從性能考慮的,因為在查詢數(shù)據(jù)時,有兩種情況:

  • 首先數(shù)據(jù)頁在內存中,內存是就是正確的結果,直接返回
  • 內存里沒有數(shù)據(jù),從數(shù)據(jù)文件上讀入內存。

所以這樣效率比較高。

場景三:MySQL 會在系統(tǒng)空閑時,進入 flush 操作。

場景四:在 MySQL 正常關閉時,會把內存臟頁 flush 到磁盤上。

引起 flush 對性能的影響

對于第三,四場景來說,是比較正常的情況,不需要考慮性能問題。

對于第一種場景,InnoDB 會盡量避免,因為在這種情況下,整個系統(tǒng)不再接受更新。

但有時出現(xiàn)人為的配置錯誤,比如內存為 128 GB,innodb_io_capacity 設置為 20000 的實例。通常建議將 redo log 設置成 4 個 1GB 的文件。但由于配置錯誤,設置成 100M 的文件。

這里由于 redo log 設置的太小,很快就會被寫滿。write pos 一直追著 check point. 這時,系統(tǒng)只能停止所有更新,推進 checkpoint.

表現(xiàn)就是,磁盤 IO 很小,但是出現(xiàn)間歇性的性能下降。

對于第二種場景,內存不夠用的情況,InnoDB 會用緩沖池(buffer pool)管理內存

內存頁在緩沖池中會有三種狀態(tài):

  • 沒用使用的數(shù)據(jù)頁
  • 使用了,但是是干凈頁
  • 使用了,是臟頁

每個數(shù)據(jù)頁頭部有LSN,8字節(jié),每次修改都會變大。

對比這個 LSN 跟 checkpoint 的 LSN,比checkpoint小的一定是干凈頁

由于 InnoDB 的策略是盡可能使用內存,所以對于長時間運行的庫來說,未被使用的頁面很少。

當發(fā)現(xiàn)想讀入的數(shù)據(jù)頁沒有在內存中時,必須到緩沖池申請數(shù)據(jù)頁。并會把最久不用得數(shù)據(jù)頁從內存中淘汰

如果是干凈頁,直接釋放使用
如果是臟頁,必須先刷盤,變成干凈頁才能復用
當時,如果在下面的情況進行刷臟頁,會明顯影響性能:

要淘汰的臟頁太多,導致查詢響應時間較長。
日志寫滿,更新被阻塞。
為了解決這個問題,InnoDB 使用控制臟頁比例的機制,來避免上面的情況。

InooDB 控制刷臟頁的策略

在 InnoDB 中,通過 innodb_io_capacity 參數(shù),來告訴 InnoDB 目前主機的磁盤能力是多少,這個值建議設置成磁盤的 IOPS.

可以通過 fio 這個工具來測試:

fio -filename=$filename -direct=1 -iodepth 1 -thread -rw=randrw -ioengine=psync -bs=16k -size=500M -numjobs=10 -runtime=10 -group_reporting -name=mytest

由于 innodb_io_capacity 導致的性能問題很常見,比如有時系統(tǒng)吞吐量(TPS)很低,寫入很慢,但是磁盤 IO 并不高。就有可能是該參數(shù)設置的不正確。例如,innodb_io_capacity 的值設置的很低,但是磁盤用的 SSD,導致 InooDB 認為系統(tǒng)能力很差,所以刷臟頁特別慢。造成臟頁累計,影響查詢和更新性能。

InnoDB 在刷盤時主要考慮兩個因素:

  1. 臟頁的比例
  2. redo log 寫盤速度

會通過這兩個因素單獨先算出兩個數(shù)字。

innodb_max_dirty_pages_pct 臟頁比例上限,默認 75%.

InnoDB 會根據(jù)臟頁的比例(M),算出范圍在 0 - 100 的數(shù)字。,過程稱為 F1(M)

# M 臟頁比例
F1(M)
{
 if M>=innodb_max_dirty_pages_pct then
  return 100;
 return 100*M/innodb_max_dirty_pages_pct;
}

除此之外,InnoDB 每次寫入日志都會有一個序號 N. 然后根據(jù) N 再算出一個 0 到 100 的數(shù)字,這個計算過程稱為 F2(N)

N: 當前寫入的序號和 checkpoint 對應序號之間的差值。

最后,根據(jù) F1(M)和 F2(N)兩個值,取其中較大的值為 R,之后引擎就可以按照 innodb_io_capacity * R 來控制刷臟頁的速度。

所以無論是在查詢,需要加載數(shù)據(jù)到內存數(shù)據(jù)頁,而淘汰臟頁。還是更新時,導致刷盤操作都有可能造成 MySQL 的性能下降。

為了避免這種情況,要合理的設置 innodb_io_capacity 的值,平時要多關注臟頁比例,不讓其接近 75%.

其中臟頁比例可以通過下面的方式獲?。?/p>

mysql> use performance_schema;
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;

初次之外,在一個查詢操作進行時,如果需要 flush 臟頁的話,如果這個該臟頁的鄰居也是臟頁的話,就會把這個鄰居一起刷掉,如果恰好旁邊還是臟頁的話,就會一直連坐。這時導致 flush 過慢的原因。

可以通過 innodb_flush_neighbors 來控制該行為,值為 1 打開上述機制,為 0 則關閉。

對于機械硬盤來說,是可以減少很多隨機 IO ,因為機械硬盤 IOPS 一般就幾百,減少隨機 IO 就意味著性能提升。

但如果用 SSD 這類 IOPS 較高的設備,IOPS 往往不是瓶頸,關閉就好,減少 SQL 語句的響應時間。

在 8.0 中,已經默認是 0 了.

總結

這篇中,主要介紹了 WAL 時的 flush 操作可能會造成 MySQL 突然的性能下降。

引起的原因一般是由于內存不夠導致的,進而可以通過設置合適的 innodb_io_capacity 參數(shù),來控制 InnoDB flush 的過程。

以上就是MySQL性能突然下降的原因的詳細內容,更多關于MySQL性能下降的資料請關注腳本之家其它相關文章!

相關文章

  • Windows 8.1下MySQL5.7 忘記root 密碼的解決方法

    Windows 8.1下MySQL5.7 忘記root 密碼的解決方法

    最近學習碰到了一件挺令人尷尬的事情,我把MySQL的密碼給忘記了,所以MySQL登錄不進去。在網上找的解決方案都不靠譜,下面小編給大家分享Windows 8.1下MySQL5.7 忘記root 密碼的解決方法,需要的朋友一起看看吧
    2017-07-07
  • Mybatis多表查詢與動態(tài)SQL特性詳解

    Mybatis多表查詢與動態(tài)SQL特性詳解

    動態(tài)SQL可以省略很多拼接SQL的步驟,使用類似于JSTL方式,下面這篇文章主要給大家介紹了關于Mybatis多表查詢與動態(tài)SQL特性的相關資料,文字通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-11-11
  • MySQL中一條查詢SQL語句的完整執(zhí)行流程

    MySQL中一條查詢SQL語句的完整執(zhí)行流程

    通常我們在使用MySQL時,我們看到的只是輸入一條語句,返回一個結果,卻不知道這條語句在MySQL內部的執(zhí)行過程,這篇文章主要給大家介紹了關于MySQL中一條查詢SQL語句的完整執(zhí)行流程,需要的朋友可以參考下
    2024-05-05
  • 關于Mysql插入中文字符報錯ERROR 1366(HY000)的解決方法

    關于Mysql插入中文字符報錯ERROR 1366(HY000)的解決方法

    這篇文章主要介紹了關于Mysql插入中文字符報錯ERROR 1366(HY000)的解決方法,在我們日常使用mysql的過程中會經常遇到各種報錯,今天我們就來看一下ERROR 1366報錯的解決方法吧
    2023-07-07
  • Mysql日志文件和日志類型介紹

    Mysql日志文件和日志類型介紹

    這篇文章主要介紹了Mysql日志文件和日志類型介紹,本文講解了日志文件類型、錯誤日志、通用查詢日志、慢速查詢日志、二進制日志等內容,需要的朋友可以參考下
    2014-12-12
  • SQL中count(1)、count(*)?與?count(列名)的區(qū)別詳細解釋

    SQL中count(1)、count(*)?與?count(列名)的區(qū)別詳細解釋

    count(1)和count(*)是SQL中用于統(tǒng)計行數(shù)的兩種常見方式,它們的區(qū)別在于統(tǒng)計的對象不同,下面這篇文章主要給大家介紹了關于SQL中count(1)、count(*)?與?count(列名)區(qū)別的相關資料,需要的朋友可以參考下
    2024-08-08
  • MySQL5.6 數(shù)據(jù)庫主從同步安裝與配置詳解(Master/Slave)

    MySQL5.6 數(shù)據(jù)庫主從同步安裝與配置詳解(Master/Slave)

    本篇文章主要介紹了MySQL5.6 數(shù)據(jù)庫主從同步安裝與配置詳解,具有一定的參考價值,有興趣的可以了解一下。
    2017-01-01
  • mysql 8.0 Windows zip包版本安裝詳細過程

    mysql 8.0 Windows zip包版本安裝詳細過程

    這篇文章主要為大家詳細介紹了mysql 8.0 Windows zip包版本安裝詳細過程,以及密碼認證插件修改,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-05-05
  • oracle/mysql數(shù)據(jù)庫多條重復數(shù)據(jù)如何取最新的

    oracle/mysql數(shù)據(jù)庫多條重復數(shù)據(jù)如何取最新的

    最近開發(fā)的時候遇到一個任務,需要對重復的數(shù)據(jù)進行篩選,只取插入時間最早的一條數(shù)據(jù),這篇文章主要給大家介紹了關于oracle/mysql數(shù)據(jù)庫多條重復數(shù)據(jù)如何取最新的相關資料,需要的朋友可以參考下
    2024-08-08
  • MySQL 聯(lián)合索引與Where子句的優(yōu)化 提高數(shù)據(jù)庫運行效率

    MySQL 聯(lián)合索引與Where子句的優(yōu)化 提高數(shù)據(jù)庫運行效率

    網站系統(tǒng)上線至今,數(shù)據(jù)量已經不知不覺上到500M,近8W記錄了。涉及數(shù)據(jù)庫操作的基本都是變得很慢了,這篇文章主要是說明配置并不是數(shù)據(jù)庫操作慢的主要原因
    2012-01-01

最新評論