1. 程式人生 > 資料庫 >MySQL慢SQL語句常見誘因以及解決方法

MySQL慢SQL語句常見誘因以及解決方法

1. 無索引、索引失效導致慢查詢

如果在一張幾千萬資料的表中以一個沒有索引的列作為查詢條件,大部分情況下查詢會非常耗時,這種查詢毫無疑問是一個慢SQL查詢。所以對於大資料量的查詢,需要建立適合的索引來優化查詢。

雖然很多時候建立了索引,但在一些特定的場景下,索引還有可能會失效,所以索引失效也是導致慢查詢的主要原因之一。

2. 鎖等待

常用的儲存引擎有 InnoDB 和 MyISAM,前者支援行鎖和表鎖,後者只支援表鎖。

如果資料庫操作是基於表鎖實現的,試想下,如果一張訂單表在更新時,需要鎖住整張表,那麼其它大量資料庫操作(包括查詢)都將處於等待狀態,這將嚴重影響到系統的併發效能。

這時,InnoDB 儲存引擎支援的行鎖更適合高併發場景。但在使用 InnoDB 儲存引擎時,要特別注意行鎖升級為表鎖的可能。在批量更新操作時,行鎖就很可能會升級為表鎖。

MySQL認為如果對一張表使用大量行鎖,會導致事務執行效率下降,從而可能造成其它事務長時間鎖等待和更多的鎖衝突問題發生,致使效能嚴重下降,所以MySQL會將行鎖升級為表鎖。還有,行鎖是基於索引加的鎖,如果在更新操作時,條件索引失效,那麼行鎖也會升級為表鎖。

因此,基於表鎖的資料庫操作,會導致SQL阻塞等待,從而影響執行速度。在一些更新操作(insert\update\delete)大於或等於讀操作的情況下,MySQL不建議使用MyISAM儲存引擎。

除了鎖升級之外,行鎖相對錶鎖來說,雖然粒度更細,併發能力提升了,但也帶來了新的問題,那就是死鎖。因此,在使用行鎖時,要注意避免死鎖。

3. 不恰當的SQL語句


使用不恰當的SQL語句也是慢SQL最常見的誘因之一。例如,習慣使用<SELECT *>,<SELECT COUNT(*)> SQL語句,在大資料表中使用<LIMIT M,N>分頁查詢,以及對非索引欄位進行排序等等。

以上就是本次介紹的全部知識點內容,感謝大家對我們的支援。