慢 SQL 語句的幾種常見誘因

2021-10-19 17:42:17 字數 845 閱讀 5772

1. 無索引、索引失效導致

慢查詢如果在一張幾千萬資料的表中以乙個沒有索引的列作為查詢條件,大部分情況下查詢會非常耗時,這種查詢毫無疑問是乙個慢 sql 查詢。

所以對於大資料量的查詢,需要建立適合的索引來優化查詢。雖然我們很多時候建立了索引,但在一些特定的場景下,索引還有可能會失效,所以索引失效也是導致慢查詢的主要原因之一。

2. 鎖等待

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

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

行鎖公升級為表鎖的可能:

在批量更新操作時,行鎖就很可能會公升級為表鎖。

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

因此,基於表鎖的資料庫操作,會導致 sql 阻塞等待,影響執行速度。

行鎖相對表鎖來說,雖然粒度更細,併發能力提公升了,但也帶來了死鎖的問題。因此,在使用行鎖時,我們要注意避免死鎖

3. 不恰當的 sql 語句

使用不恰當的 sql 語句也是慢 sql 最常見的誘因之一 :

在大資料表中使用 分頁查詢,以及對非索引字段進行排序等等。

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

1.無索引 索引失效導致慢查詢 如果在一張幾千萬資料的表中以乙個沒有索引的列作為查詢條件,程式設計客棧大部分情況下查詢會非常耗時,這種查詢毫無疑問是乙個慢sql查詢。所以對於大資料量的查詢,需要建立適合的索引來優化查詢。雖然很多時候建立了索引,但在一些特定的場景下,索引還有可能會失效,所以索引失效也...

mysql常見慢sql mysql 慢SQL分析

開啟慢sql記錄 為什麼要開啟慢sql記錄 mysql在執行過程中,某些sql可能會執行較長時間,我們通過配置一些東西,把這些sql記錄下來,以便我們分析和優化sql。首先先檢視是否已經開啟了記錄設定 mysql show variables like query variable name val...

常見的SQL語句

新建表 create table 表名 自動編號字段 int identity 1,1 primary key 欄位1 nvarchar 50 default 預設值 null 欄位2 ntext null 欄位3 datetime,欄位4 money null 欄位5 int default 0,...