SQL執行慢的原因分析


SQL語句為什么執行的很慢?
一條 SQL 語句執行的很慢,那是每次執行都很慢呢?還是大多數情況下是正常的,偶爾出現很慢呢?所以我覺得,我們還得分以下兩種情況來討論。

大多數情況是正常的,只是偶爾會出現很慢的情況。
在數據量不變的情況下,這條SQL語句一直以來都執行的很慢。

一、針對偶爾很慢的情況
1、數據庫在刷新臟頁
當我們要往數據庫插入一條數據、或者要更新一條數據的時候,我們知道數據庫會在內存中把對應字段的數據更新了,但是更新之后,這些更新的字段並不會馬上同步持久化到磁盤中去,而是把這些更新的記錄寫入到 redo log 日記中去,等到空閑的時候,在通過 redo log 里的日記把最新的數據同步到磁盤中去。

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

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

如果要判斷是否真的在等待鎖,我們可以用 show processlist這個命令來查看當前的狀態哦,這里我要提醒一下,有些命令最好記錄一下,反正,我被問了好幾個命令,都不知道怎么寫,呵呵。

下來我們來訪分析下第二種情況,我覺得第二種情況的分析才是最重要的。
二、針對一直都這么慢的情況
1、沒用到索引

1)字段沒有索引

2)字段有索引,但卻沒有用索引

3)函數操作導致沒有用上索引

2、數據庫自己選錯索引


以上是我的總結與理解,最后一個部分,我怕很多人不大懂數據庫居然會選錯索引,所以我詳細解釋了一下,下面我對以上做一個總結。

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

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

數據庫在刷新臟頁,例如 redo log 寫滿了需要同步到磁盤。
執行的時候,遇到鎖,如表鎖、行鎖。

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

沒有用上索引:例如該字段沒有索引;由於對字段進行運算、函數操作導致無法用索引。
數據庫選錯了索引。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM