SQL語句執行很慢的原因

2021-09-26 15:05:04 字數 1271 閱讀 7092

資料庫在重新整理髒頁

當我們要往資料庫插入一條資料、或者要更新一條資料的時候,我們知道資料庫會在記憶體中把對應欄位的資料更新了,但是更新之後,這些更新的字段並不會馬上同步持久化到磁碟中去,而是把這些更新的記錄寫入到 redo log 日記中去,等到空閒的時候,在通過 redo log 裡的日記把最新的資料同步到磁碟中去。

當記憶體資料頁跟磁碟資料頁內容不一致的時候,我們稱這個記憶體頁為「髒頁」。

記憶體資料寫入到磁碟後,記憶體和磁碟上的資料頁的內容就一致了,稱為「乾淨頁」。

刷髒頁有下面4種場景:

1.redo log寫滿了:redo log 裡的容量是有限的,如果資料庫一直很忙,更新又很頻繁,這個時候 redo log 很快就會被寫滿了,這個時候就沒辦法等到空閒的時候再把資料同步到磁碟的,只能暫停其他操作,全身心來把資料同步到磁碟中去的,而這個時候,就會導致我們平時正常的sql語句突然執行的很慢,所以說,資料庫在在同步資料到磁碟的時候,就有可能導致我們的sql語句執行的很慢了。

2.記憶體不夠用了:如果一次查詢較多的資料,恰好碰到所查資料頁不在記憶體中時,需要申請記憶體,而此時恰好記憶體不足的時候就需要淘汰一部分記憶體資料頁,如果是乾淨頁,就直接釋放,如果恰好是髒頁就需要刷髒頁。

3.mysql 認為系統「空閒」的時候:這時系統沒什麼壓力。

4.mysql 正常關閉的時候:這時候,mysql 會把記憶體的髒頁都 flush 到磁碟上,這樣下次 mysql 啟動的時候,就可以直接從磁碟上讀資料,啟動速度會很快。

這四種場景中會影響我們使用的主要是前兩種。

拿不到鎖

這個就比較容易想到了,我們要執行的這條語句,剛好這條語句涉及到的表,別人在用,並且加鎖了,我們拿不到鎖,只能慢慢等待別人釋放鎖了。或者,表沒有加鎖,但要使用到的某個一行被加鎖了。

如果要判斷是否真的在等待鎖,我們可以用 show processlist這個命令來檢視當前的狀態。

一直很慢的情況

如果在資料量一樣大的情況下,這條sql語句每次都執行的這麼慢,那就要好好考慮下sql書寫的問題了

沒用上索引

字段沒有索引

欄位有索引,索引失效

總結乙個 sql 執行的很慢,我們要分兩種情況討論:

1、大多數情況下很正常,偶爾很慢,則有如下原因

(1)、資料庫在重新整理髒頁,例如 redo log 寫滿了需要同步到磁碟。

(2)、執行的時候,遇到鎖,如表鎖、行鎖。

2、這條 sql 語句一直執行的很慢,則有如下原因。

(1)、沒有用上索引:例如該欄位沒有索引;由於對欄位進行運算、函式操作導致無法用索引。

(2)、資料庫選錯了索引。

SQL 語句執行很慢的原因

刷髒頁有下面4種場景 後兩種不用太關注 效能 問題 有索引但是最終卻選擇全表掃瞄的原因 例如以下sql select from t where 100 c and c 100000 索引的選擇判斷 於系統的 也就是說,如果要走 c 字段索引的話,系統會 走 c 字段索引大概需要掃瞄多少行。如果 到要...

一條SQL語句執行很慢的原因有哪些?

一直很慢的情況 資料庫自己選錯索引了 總結一條 sql 語句執行的很慢,那是每次執行都很慢呢?還是大多數情況下是正常的,偶爾出現很慢呢?所以我覺得,我們還得分以下兩種情況來討論。1 大多數情況是正常的,只是偶爾會出現很慢的情況。2 在資料量不變的情況下,這條sql語句一直以來都執行的很慢。針對這兩種...

一條 sql 語句執行的很慢的原因有哪些?

說實話,這個問題可以涉及到 mysql 的很多核心知識,可以扯出一大堆,就像要考你計算機網路的知識時,問你 輸入url回車之後,究竟發生了什麼 一樣,看看你能說出多少了。開始裝逼 分類討論 一條 sql 語句執行的很慢,那是每次執行都很慢呢?還是大多數情況下是正常的,偶爾出現很慢呢?所以我覺得,我們...