欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

導致sql執(zhí)行速度慢的幾種情況盤點(生產環(huán)境踩過的坑)

 更新時間:2023年03月09日 11:52:09   作者:程序員拾山  
盤點分析MySQL執(zhí)行速度慢可以幫助我們進行優(yōu)化MySQL數(shù)據庫的效率,這篇文章主要給大家盤點介紹了關于導致sql執(zhí)行速度慢的幾種情況,文中介紹的這些主要是生產環(huán)境踩過的坑,需要的朋友可以參考下

前言

當我們遇到慢sql,第一反應可能就是去優(yōu)化我們的sql語句。一些比較復雜的語句如果執(zhí)行慢可能還能理解,但是有時一些特別簡單的查詢也會變得卡頓,“查一行”,也會執(zhí)行得特別慢。今天,我們盤點一下,都有哪些情況會導致sql執(zhí)行速度慢。

1,數(shù)據庫本身壓力較大

如果數(shù)據庫本身的性能壓力就比較大,資源比較緊張,CPU占用率或者IO利用率很高,這時會導致所有的語句執(zhí)行起來都比較慢。這種情況下首先要做的應該是提升服務器的配置,然后觀察服務器的性能指標是否平穩(wěn)。

2,表鎖沖突

如果遇到一個簡單的查詢長時間未返回結果,那么大概率是表被鎖住了。一般遇到這種情況,都是通過show processlist命令,查看sql語句的狀態(tài)。

如圖所示,id為8的語句正在等待一個MDL鎖,我們可以使用kill命令殺掉這個阻塞線程。

另外還可以通過表sys.schema_table_lock_waits查詢阻塞的線程id。

3,行鎖沖突

mysql> select * from temp where id =3 for update;

當我們訪問id=3這條記錄時,使用了for update,表示要對這條語句加鎖。但是如果此時已經有另一個事務對這條記錄加了鎖,并且一直持有不釋放鎖,那么當前語句就會一直阻塞。

通過上圖可以看出,第一個語句不提交事務,第二個語句就一直處于等待阻塞狀態(tài)。

我們執(zhí)行show processlist,

可以看出確實有一個線程處于阻塞狀態(tài)。

鎖沖突會導致執(zhí)行效率降低,進而影響到業(yè)務,需要我們重點關注。

4,索引未命中

mysql> select * from t where c=50000 limit 1;

如果字段c上面沒有索引,那么就只能走主鍵id順序掃描,一直掃描到第50000行才能停下來。

給表數(shù)據加索引可以快速提升查詢性能,一般來說,因為索引失效導致的慢sql可能是我們平常開發(fā)過程中經常遇到的。

5,多表join查詢

有了索引,并不代表萬事大吉。如果一個比較復雜的sql,需要關聯(lián)很多表進行查詢,即使每張表的索引都可以起到作用,但是由于數(shù)據量過多,即使都命中索引,掃描的行數(shù)仍然是巨大的。這樣sql的執(zhí)行速度仍然會受到很大影響。

一般來說,超過3個表的join就應該盡量避免,將其拆分為多個查詢,使用空間換時間也不失為一個好辦法。

補充知識:慢 SQL 語句的幾種常見誘因

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

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

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

2. 鎖等待

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

如果數(shù)據庫操作是基于表鎖實現(xiàn)的,試想下,如果一張數(shù)據表在更新時,需要鎖住整張表,那么其它大量數(shù)據庫操作(包括查詢)都將處于等待狀態(tài),這將嚴重影響到系統(tǒng)的并發(fā)性能。這時,InnoDB 存儲引擎支持的行鎖更適合高并發(fā)場景。

行鎖升級為表鎖的可能:

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

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

因此,基于表鎖的數(shù)據庫操作,會導致 SQL 阻塞等待,影響執(zhí)行速度。

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

3. 不恰當?shù)?SQL 語句

使用不恰當?shù)?SQL 語句也是慢 SQL 最常見的誘因之一 :

在大數(shù)據表中使用 分頁查詢,以及對非索引字段進行排序等等。

總結

總的來說,sql執(zhí)行速度慢會受到很多種情況的影響,比如表鎖,行鎖。在實際的業(yè)務場景中也許會更復雜,但是處理起來的步驟基本大同小異,只要找到問題的根源,知道如何解決,處理起來就可以做到心中有數(shù),游刃有余。

到此這篇關于導致sql執(zhí)行速度慢的幾種情況盤點的文章就介紹到這了,更多相關sql執(zhí)行速度慢的情況內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • Mysql最新版8.0.21下載安裝配置教程詳解

    Mysql最新版8.0.21下載安裝配置教程詳解

    這篇文章主要介紹了Mysql最新版8.0.21下載安裝配置教程,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-08-08
  • MYSQL主從庫不同步故障一例解決方法

    MYSQL主從庫不同步故障一例解決方法

    第一次做完主從庫同步后正常,但工作過程中發(fā)現(xiàn)有一個庫的數(shù)據庫沒有同步起來,在另外一個mysql(3307)中
    2010-06-06
  • MySQL kill不掉線程的原因

    MySQL kill不掉線程的原因

    這篇文章主要介紹了MySQL kill不掉線程的原因,幫助大家更好的理解和學習使用MySQL數(shù)據庫,感興趣的朋友可以了解下
    2021-05-05
  • MySql分表、分庫、分片和分區(qū)知識深入詳解

    MySql分表、分庫、分片和分區(qū)知識深入詳解

    這篇文章主要介紹了MySql分表、分庫、分片和分區(qū)知識深入詳解,如果有并發(fā)場景和數(shù)據量較大的場景的可以看一下文章,對你會有或多或少的幫助
    2021-03-03
  • 詳解mysql不等于null和等于null的寫法

    詳解mysql不等于null和等于null的寫法

    這篇文章主要介紹了詳解mysql不等于null和等于null的寫法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-09-09
  • RR與RC隔離級別下索引和鎖的測試腳本示例代碼

    RR與RC隔離級別下索引和鎖的測試腳本示例代碼

    這篇文章主要給大家介紹了關于RR與RC隔離級別下索引和鎖的測試腳本的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2018-12-12
  • MySQL中VARCHAR與CHAR格式數(shù)據的區(qū)別

    MySQL中VARCHAR與CHAR格式數(shù)據的區(qū)別

    char是一種固定長度的類型,varchar則是一種可變長度的類型,那么他們具體使用過程中有什么區(qū)別嗎
    2015-09-09
  • 優(yōu)化mysql的limit offset的例子

    優(yōu)化mysql的limit offset的例子

    在mysql中,通常使用limit做分頁,而且經常會跟order by 連用。在order by 上加索引有時候是很有幫助的,不然系統(tǒng)會做很多的filesort
    2013-02-02
  • mysql中影響數(shù)據庫性能的因素講解

    mysql中影響數(shù)據庫性能的因素講解

    在本篇文章中我們給大家講述了mysql中影響性能的因素以及相關知識點內容,有興趣的朋友參考下。
    2018-09-09
  • 為mysql數(shù)據庫添加添加事務處理的方法

    為mysql數(shù)據庫添加添加事務處理的方法

    開始首先說明一下,mysql數(shù)據庫默認的數(shù)據庫引擎是MyISAM,是不支持事務的,單數(shù)如果你添加了數(shù)據執(zhí)行語句是不會出錯的,單數(shù)不管用,即便是回滾事務,記錄也是插入進去了,所有首先我們要做的第一步是更改數(shù)據庫引擎
    2011-07-07

最新評論