數據庫執行SQL語句很慢的原因

一個 SQL 執行的很慢,兩種情況討論:

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

(1)、數據庫在刷新髒頁,例如 redo log 寫滿了需要同步到磁盤

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

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

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

(2)、數據庫選錯索引


1.數據庫在刷新髒頁,例如 redo log 寫滿了需要同步到磁盤

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

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

2.執行的時候,遇到鎖,如表鎖、行鎖

剛好這條語句涉及到的表,別人在用,並且加鎖了,我們拿不到鎖,只能慢慢等待別人釋放鎖了。或者,表沒有加鎖,但要使用到的某個一行被加鎖了,這個時候,我也沒辦法啊。

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

3.沒有用上索引

  • 字段沒有索引
  • 字段有索引,但卻沒有用索引(有索引卻不使用索引的那些情況)

4.數據庫選錯索引

  • 主鍵索引和非主鍵索引是有區別的,主鍵索引存放的值是整行字段的數據,而非主鍵索引上存放的值不是整行字段的數據,而且存放主鍵字段的值。也就是說,我們如果走 c 這個非主鍵字段的索引的話,最後會查詢到對應主鍵a的值,然後,再根據主鍵的值走主鍵索引,查詢到整行數據返回。
  • 由於統計的失誤,導致系統沒有走索引,而是走了全表掃描

【Java 面試那點事】

這裏致力於分享 Java 面試路上的各種知識,無論是技術還是經驗,你需要的這裏都有!

這裏可以讓你【快速瞭解 Java 相關知識】,並且【短時間在面試方面有跨越式提升】

面試路上,你不孤單!
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章