校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃

主頁 > 知識庫 > 騰訊面試:一條SQL語句執行得很慢的原因有哪些?---不看后悔系列(推薦)

騰訊面試:一條SQL語句執行得很慢的原因有哪些?---不看后悔系列(推薦)

熱門標簽:昌德訊外呼系統 福建外呼電銷機器人加盟 徐涇鎮騰訊地圖標注 中國地圖標注公司 百度地圖標注要什么軟件 自己做地圖標注需要些什么 天津公司外呼系統軟件 電話機器人的價格多少錢一個月 400電話申請廠家現貨

說實話,這個問題可以涉及到 MySQL 的很多核心知識,可以扯出一大堆,就像要考你計算機網絡的知識時,問你“輸入URL回車之后,究竟發生了什么”一樣,看看你能說出多少了。

之前騰訊面試的實話,也問到這個問題了,不過答的很不好,之前沒去想過相關原因,導致一時之間扯不出來。所以今天,我帶大家來詳細扯一下有哪些原因,相信你看完之后一定會有所收獲,不然你打我。

開始裝逼:分類討論

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

1、大多數情況是正常的,只是偶爾會出現很慢的情況。

2、在數據量不變的情況下,這條SQL語句一直以來都執行的很慢。

針對這兩種情況,我們來分析下可能是哪些原因導致的。

針對偶爾很慢的情況

一條 SQL 大多數情況正常,偶爾才能出現很慢的情況,針對這種情況,我覺得這條SQL語句的書寫本身是沒什么問題的,而是其他原因導致的,那會是什么原因呢?

數據庫在刷新臟頁我也無奈啊

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

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

拿不到鎖我能怎么辦

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

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

下來我們來訪分析下第二種情況,我覺得第二種情況的分析才是最重要的

針對一直都這么慢的情況

如果在數據量一樣大的情況下,這條 SQL 語句每次都執行的這么慢,那就就要好好考慮下你的 SQL 書寫了,下面我們來分析下哪些原因會導致我們的 SQL 語句執行的很不理想。

我們先來假設我們有一個表,表里有下面兩個字段,分別是主鍵 id,和兩個普通字段 c 和 d。

mysql> CREATE TABLE `t` (
 `id` int(11) NOT NULL,
 `c` int(11) DEFAULT NULL,
 `d` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB;

扎心了,沒用到索引

沒有用上索引,我覺得這個原因是很多人都能想到的,例如你要查詢這條語句

select * from t where 100 c and c  100000;

字段沒有索引

剛好你的 c 字段上沒有索引,那么抱歉,只能走全表掃描了,你就體驗不會索引帶來的樂趣了,所以,這回導致這條查詢語句很慢。

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

好吧,這個時候你給 c 這個字段加上了索引,然后又查詢了一條語句

select * from t where c - 1 = 1000;

我想問大家一個問題,這樣子在查詢的時候會用索引查詢嗎?

答是不會,如果我們在字段的左邊做了運算,那么很抱歉,在查詢的時候,就不會用上索引了,所以呢,大家要注意這種字段上有索引,但由于自己的疏忽,導致系統沒有使用索引的情況了。

正確的查詢應該如下

select * from t where c = 1000 + 1;

有人可能會說,右邊有運算就能用上索引?難道數據庫就不會自動幫我們優化一下,自動把 c - 1=1000 自動轉換為 c = 1000+1。

不好意思,確實不會幫你,所以,你要注意了。

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

如果我們在查詢的時候,對字段進行了函數操作,也是會導致沒有用上索引的,例如

select * from t where pow(c,2) = 1000;

這里我只是做一個例子,假設函數 pow 是求 c 的 n 次方,實際上可能并沒有 pow(c,2)這個函數。其實這個和上面在左邊做運算也是很類似的。

所以呢,一條語句執行都很慢的時候,可能是該語句沒有用上索引了,不過具體是啥原因導致沒有用上索引的呢,你就要會分析了,我上面列舉的三個原因,應該是出現的比較多的吧。

呵呵,數據庫自己選錯索引了

我們在進行查詢操作的時候,例如

select * from t where 100  c and c  100000;

我們知道,主鍵索引和非主鍵索引是有區別的,主鍵索引存放的值是整行字段的數據,而非主鍵索引上存放的值不是整行字段的數據,而且存放主鍵字段的值。不大懂的可以看我這篇文章:面試小知識:MySQL索引相關 里面有說到主鍵索引和非主鍵索引的區別

也就是說,我們如果走 c 這個字段的索引的話,最后會查詢到對應主鍵的值,然后,再根據主鍵的值走主鍵索引,查詢到整行數據返回。

好吧扯了這么多,其實我就是想告訴你,就算你在 c 字段上有索引,系統也并不一定會走 c 這個字段上的索引,而是有可能會直接掃描掃描全表,找出所有符合 100 c and c 100000 的數據。

為什么會這樣呢?

其實是這樣的,系統在執行這條語句的時候,會進行預測:究竟是走 c 索引掃描的行數少,還是直接掃描全表掃描的行數少呢?顯然,掃描行數越少當然越好了,因為掃描行數越少,意味著I/O操作的次數越少。

如果是掃描全表的話,那么掃描的次數就是這個表的總行數了,假設為 n;而如果走索引 c 的話,我們通過索引 c 找到主鍵之后,還得再通過主鍵索引來找我們整行的數據,也就是說,需要走兩次索引。而且,我們也不知道符合 100 c and c 10000 這個條件的數據有多少行,萬一這個表是全部數據都符合呢?這個時候意味著,走 c 索引不僅掃描的行數是 n,同時還得每行數據走兩次索引。

所以呢,系統是有可能走全表掃描而不走索引的。那系統是怎么判斷呢?

判斷來源于系統的預測,也就是說,如果要走 c 字段索引的話,系統會預測走 c 字段索引大概需要掃描多少行。如果預測到要掃描的行數很多,它可能就不走索引而直接掃描全表了。

那么問題來了,系統是怎么預測判斷的呢?這里我給你講下系統是怎么判斷的吧,雖然這個時候我已經寫到脖子有點酸了。

系統是通過索引的區分度來判斷的,一個索引上不同的值越多,意味著出現相同數值的索引越少,意味著索引的區分度越高。我們也把區分度稱之為基數,即區分度越高,基數越大。所以呢,基數越大,意味著符合 100 c and c 10000 這個條件的行數越少。

所以呢,一個索引的基數越大,意味著走索引查詢越有優勢。

那么問題來了,怎么知道這個索引的基數呢?

系統當然是不會遍歷全部來獲得一個索引的基數的,代價太大了,索引系統是通過遍歷部分數據,也就是通過采樣的方式,來預測索引的基數的。

扯了這么多,重點的來了,居然是采樣,那就有可能出現失誤的情況,也就是說,c 這個索引的基數實際上是很大的,但是采樣的時候,卻很不幸,把這個索引的基數預測成很小。例如你采樣的那一部分數據剛好基數很小,然后就誤以為索引的基數很小。然后就呵呵,系統就不走 c 索引了,直接走全部掃描了。

所以呢,說了這么多,得出結論:由于統計的失誤,導致系統沒有走索引,而是走了全表掃描,而這,也是導致我們 SQL 語句執行的很慢的原因。

這里我聲明一下,系統判斷是否走索引,掃描行數的預測其實只是原因之一,這條查詢語句是否需要使用使用臨時表、是否需要排序等也是會影響系統的選擇的。

不過呢,我們有時候也可以通過強制走索引的方式來查詢,例如

select * from t force index(a) where c  100 and c  100000;

我們也可以通過

show index from t;

來查詢索引的基數和實際是否符

analyze table t;

合,如果和實際很不符合的話,我們可以重新來統計索引的基數,可以用這條命令

來重新統計分析。

既然會預測錯索引的基數,這也意味著,當我們的查詢語句有多個索引的時候,系統有可能也會選錯索引哦,這也可能是 SQL 執行的很慢的一個原因。

好吧,就先扯這么多了,你到時候能扯出這么多,我覺得已經很棒了,下面做一個總結。

### 總結

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

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

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

(1)、數據庫在刷新臟頁,例如 redo log 寫滿了需要同步到磁盤。

(2)、執行的時候,遇到鎖,如表鎖、行鎖。

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

(1)、沒有用上索引:例如該字段沒有索引;由于對字段進行運算、函數操作導致無法用索引。

(2)、數據庫選錯了索引。

大家如果有補充的,也是可以留言區補充一波哦。

以上所述是小編給大家介紹的SQL語句執行慢的原因詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網站的支持!

您可能感興趣的文章:
  • 批量執行sql語句的方法
  • 在SQL Server啟動時自動執行存儲過程。
  • 提高SQL的執行效率的ASP的五種做法
  • asp在線執行sql語句的函數
  • 為什么ASP中執行動態SQL總報錯誤信息?提示語句語法錯誤
  • mysql 顯示SQL語句執行時間的代碼
  • php執行sql語句的寫法
  • 高級MySQL數據庫面試問題 附答案
  • sql面試題(查看數據中指定幾行記錄)
  • 一道sql面試題附答案

標簽:昌都 荊門 黔西 駐馬店 梅河口 鄂爾多斯 北京 陜西

巨人網絡通訊聲明:本文標題《騰訊面試:一條SQL語句執行得很慢的原因有哪些?---不看后悔系列(推薦)》,本文關鍵詞  騰訊,面試,一條,SQL,語句,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《騰訊面試:一條SQL語句執行得很慢的原因有哪些?---不看后悔系列(推薦)》相關的同類信息!
  • 本頁收集關于騰訊面試:一條SQL語句執行得很慢的原因有哪些?---不看后悔系列(推薦)的相關信息資訊供網民參考!
  • 推薦文章
    校园春色亚洲色图_亚洲视频分类_中文字幕精品一区二区精品_麻豆一区区三区四区产品精品蜜桃
    丝袜国产日韩另类美女| 色拍拍在线精品视频8848| 精品视频在线免费看| 中文字幕一区av| av色综合久久天堂av综合| 日本一区二区三区久久久久久久久不| 性久久久久久久| 5566中文字幕一区二区电影| 日本午夜一本久久久综合| 欧美日韩国产另类一区| 天堂影院一区二区| 911精品国产一区二区在线| 美女被吸乳得到大胸91| 精品免费一区二区三区| 国产伦精品一区二区三区免费迷 | 91成人网在线| 午夜激情一区二区| 精品国产91久久久久久久妲己| 国产自产2019最新不卡| 国产精品动漫网站| 51精品久久久久久久蜜臀| 久久精品国产在热久久| 最新中文字幕一区二区三区| 在线观看中文字幕不卡| 欧美aaaaaa午夜精品| 国产亚洲福利社区一区| 91久久奴性调教| 久久精品国产99| 亚洲激情图片qvod| 久久久.com| 欧美精品乱码久久久久久| 国产激情精品久久久第一区二区| 亚洲欧美日韩人成在线播放| 日韩免费一区二区| 在线免费观看日本欧美| 粉嫩av一区二区三区| 青青草一区二区三区| 亚洲精品老司机| 欧美高清在线精品一区| 日韩免费性生活视频播放| 欧美视频在线观看一区二区| 99精品久久久久久| 国产91精品入口| 麻豆国产精品一区二区三区| 亚瑟在线精品视频| 亚洲黄色性网站| 国产精品成人午夜| 亚洲欧洲另类国产综合| 国产精品入口麻豆九色| 国产欧美一区二区精品久导航| 欧美一级欧美一级在线播放| 色婷婷精品久久二区二区蜜臀av | 香蕉av福利精品导航| 一区二区久久久| 亚洲成人激情av| 日韩精品乱码免费| 麻豆91在线播放免费| 久久99精品一区二区三区三区| 午夜在线电影亚洲一区| 爽好多水快深点欧美视频| 日韩成人免费电影| 精品一区二区日韩| www.亚洲国产| 欧美日韩三级一区二区| 日韩视频免费直播| 国产欧美日韩在线观看| 亚洲欧美另类久久久精品2019| 亚洲18影院在线观看| 蜜臂av日日欢夜夜爽一区| 国产 欧美在线| 欧美日韩1区2区| 国产欧美一区二区三区鸳鸯浴| 国产精品免费av| 午夜精品福利一区二区三区av| 极品美女销魂一区二区三区| 91蝌蚪porny| 久久网站最新地址| 亚洲第一在线综合网站| 国产精品99久久久久久久女警| 91高清视频免费看| 久久品道一品道久久精品| 亚洲第一电影网| 91久久一区二区| 中文字幕久久午夜不卡| 精品中文av资源站在线观看| 欧美人伦禁忌dvd放荡欲情| 国产精品欧美久久久久无广告| 毛片基地黄久久久久久天堂| 色噜噜狠狠一区二区三区果冻| 久久九九久精品国产免费直播| 亚洲国产精品一区二区久久恐怖片| 国产在线看一区| 色视频成人在线观看免| 亚洲欧美电影一区二区| 国产成人8x视频一区二区| 26uuu久久天堂性欧美| 青青草国产精品97视觉盛宴| 欧美日韩免费观看一区二区三区| 中文字幕av一区二区三区免费看| 国产一区二区三区在线观看免费| 欧美精品日韩综合在线| 亚洲mv大片欧洲mv大片精品| 欧美色综合久久| 视频一区中文字幕国产| 制服丝袜一区二区三区| 日韩在线一二三区| 26uuu亚洲| eeuss鲁一区二区三区| 亚洲美女视频在线观看| 欧美日韩一二三| 国产乱码精品一品二品| 国产精品久久久久久久蜜臀| 91国在线观看| 蜜桃av噜噜一区| 成人欧美一区二区三区1314| 色综合一个色综合| 久久精品免费观看| 中文字幕中文字幕一区二区 | 激情五月婷婷综合| 国产精品久久久久一区二区三区共| 97精品超碰一区二区三区| 日本视频一区二区| 国产精品电影一区二区| 制服丝袜激情欧洲亚洲| 福利一区在线观看| 日韩中文字幕91| 国产精品久久久久久久岛一牛影视| 欧美日韩一区二区三区在线| 国产一区欧美日韩| 日韩成人伦理电影在线观看| 亚洲日本在线看| 久久久久成人黄色影片| 欧美一区二区在线观看| 91女厕偷拍女厕偷拍高清| 国产伦精品一区二区三区免费 | 国产精品国产三级国产普通话99| 欧美日韩欧美一区二区| 色综合久久久久综合体| 成人免费视频国产在线观看| 久久国产综合精品| 日韩高清不卡在线| 一区二区高清视频在线观看| 国产精品视频免费| 中文字幕精品—区二区四季| 日韩视频一区二区在线观看| 欧美日韩午夜影院| 91精品国产品国语在线不卡| 欧美日韩视频在线一区二区| 色狠狠色狠狠综合| 欧美亚洲禁片免费| 欧美亚洲动漫制服丝袜| 欧美日韩一区二区三区在线看| 在线观看一区日韩| 欧美图区在线视频| 欧美猛男男办公室激情| 欧美一区二区三区视频免费| 日韩一区二区免费在线观看| 欧美精品一区二区三区四区| 久久久久一区二区三区四区| 久久久久久电影| 亚洲精品高清视频在线观看| 一区二区三区日本| 久草这里只有精品视频| 国产福利一区二区三区在线视频| 成人午夜视频在线| 欧美性猛交xxxx乱大交退制版| 91成人免费在线视频| 欧美成人三级电影在线| 欧美激情综合网| 午夜精品123| 波多野结衣中文字幕一区二区三区| 欧美性受极品xxxx喷水| 欧美不卡一区二区| 亚洲人成影院在线观看| 久久国产剧场电影| 色激情天天射综合网| 国产肉丝袜一区二区| 天天免费综合色| 99在线热播精品免费| 亚洲精品一区二区三区99| 亚洲综合在线第一页| eeuss国产一区二区三区| 精品精品国产高清一毛片一天堂| 亚洲午夜视频在线观看| 成人一级视频在线观看| 日韩欧美成人午夜| 五月综合激情网| 欧美亚洲日本国产| 亚洲另类在线制服丝袜| 丁香六月久久综合狠狠色| 精品女同一区二区| 精品在线播放免费| 日韩一级黄色大片| 亚洲高清免费观看高清完整版在线观看 | 成人99免费视频| 国产午夜亚洲精品午夜鲁丝片| 久久精品国产77777蜜臀| 欧美一区二区三区四区在线观看| 夜夜精品视频一区二区| 91国产福利在线|