您好,登錄后才能下訂單哦!
這篇文章主要介紹了導致sql執行速度慢的情況有哪些的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇導致sql執行速度慢的情況有哪些文章都會有所收獲,下面我們一起來看看吧。
如果數據庫本身的性能壓力就比較大,資源比較緊張,CPU占用率或者IO利用率很高,這時會導致所有的語句執行起來都比較慢。這種情況下首先要做的應該是提升服務器的配置,然后觀察服務器的性能指標是否平穩。
如果遇到一個簡單的查詢長時間未返回結果,那么大概率是表被鎖住了。一般遇到這種情況,都是通過show processlist命令,查看sql語句的狀態。
如圖所示,id為8的語句正在等待一個MDL鎖,我們可以使用kill命令殺掉這個阻塞線程。
另外還可以通過表sys.schema_table_lock_waits查詢阻塞的線程id。
mysql> select * from temp where id =3 for update;
當我們訪問id=3這條記錄時,使用了for update,表示要對這條語句加鎖。但是如果此時已經有另一個事務對這條記錄加了鎖,并且一直持有不釋放鎖,那么當前語句就會一直阻塞。
通過上圖可以看出,第一個語句不提交事務,第二個語句就一直處于等待阻塞狀態。
我們執行show processlist,
可以看出確實有一個線程處于阻塞狀態。
鎖沖突會導致執行效率降低,進而影響到業務,需要我們重點關注。
mysql> select * from t where c=50000 limit 1;
如果字段c上面沒有索引,那么就只能走主鍵id順序掃描,一直掃描到第50000行才能停下來。
給表數據加索引可以快速提升查詢性能,一般來說,因為索引失效導致的慢sql可能是我們平常開發過程中經常遇到的。
有了索引,并不代表萬事大吉。如果一個比較復雜的sql,需要關聯很多表進行查詢,即使每張表的索引都可以起到作用,但是由于數據量過多,即使都命中索引,掃描的行數仍然是巨大的。這樣sql的執行速度仍然會受到很大影響。
一般來說,超過3個表的join就應該盡量避免,將其拆分為多個查詢,使用空間換時間也不失為一個好辦法。
1. 無索引、索引失效導致
慢查詢如果在一張幾千萬數據的表中以一個沒有索引的列作為查詢條件,大部分情況下查詢會非常耗時,這種查詢毫無疑問是一個慢 SQL 查詢。
所以對于大數據量的查詢,需要建立適合的索引來優化查詢。雖然我們很多時候建立了索引,但在一些特定的場景下,索引還有可能會失效,所以索引失效也是導致慢查詢的主要原因之一。
2. 鎖等待
常用的存儲引擎有 InnoDB 和 MyISAM,前者支持行鎖和表鎖,后者只支持表鎖。
如果數據庫操作是基于表鎖實現的,試想下,如果一張數據表在更新時,需要鎖住整張表,那么其它大量數據庫操作(包括查詢)都將處于等待狀態,這將嚴重影響到系統的并發性能。這時,InnoDB 存儲引擎支持的行鎖更適合高并發場景。
行鎖升級為表鎖的可能:
在批量更新操作時,行鎖就很可能會升級為表鎖。
MySQL 認為如果對一張表使用大量行鎖,會導致事務執行效率下降,從而可能造成其它事務長時間鎖等待和更多的鎖沖突問題發生,致使性能嚴重下降,所以 MySQL 會將行鎖升級為表鎖。還有,行鎖是基于索引加的鎖,如果我們在更新操作時,條件索引失效,那么行鎖也會升級為表鎖。
因此,基于表鎖的數據庫操作,會導致 SQL 阻塞等待,影響執行速度。
行鎖相對表鎖來說,雖然粒度更細,并發能力提升了,但也帶來了死鎖的問題。因此,在使用行鎖時,我們要注意避免死鎖。
3. 不恰當的 SQL 語句
使用不恰當的 SQL 語句也是慢 SQL 最常見的誘因之一 :
在大數據表中使用 分頁查詢,以及對非索引字段進行排序等等。
關于“導致sql執行速度慢的情況有哪些”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“導致sql執行速度慢的情況有哪些”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。