婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 騰訊面試:一條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語句執行得很慢的原因有哪些?---不看后悔系列(推薦)的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    国产精品久久久久久户外露出| 九九九精品视频| 日本韩国精品在线| 欧美一区二区视频免费观看| jlzzjlzz国产精品久久| 国产日韩视频一区二区三区| 亚洲电影中文字幕在线观看| 欧美肥妇bbw| 国产一区二区成人久久免费影院| 高清国产一区二区| 国产日韩v精品一区二区| 成人aa视频在线观看| 一本大道综合伊人精品热热| 91.com在线观看| 亚洲三级在线看| 国产福利一区二区三区视频 | 精品一区二区三区日韩| 欧美色综合天天久久综合精品| **性色生活片久久毛片| 麻豆一区二区三区| 日韩精品一区二| 色婷婷av一区二区三区大白胸| 久久不见久久见免费视频7| 欧美少妇性性性| 亚洲福利视频三区| 日本一区二区成人| 亚洲风情在线资源站| 国产精品国产三级国产aⅴ入口 | 日韩vs国产vs欧美| 精品一区二区三区久久久| 成人免费在线观看入口| 一个色妞综合视频在线观看| 亚洲视频电影在线| 久久久久九九视频| 久久精品亚洲乱码伦伦中文 | 视频一区在线播放| 色爱区综合激月婷婷| 欧美伦理电影网| 久久69国产一区二区蜜臀| 亚洲精品一区二区三区精华液| 国产美女一区二区三区| 亚洲欧美在线另类| 欧美丝袜自拍制服另类| 日本不卡免费在线视频| 久久精品一区二区| 色爱区综合激月婷婷| 日韩成人伦理电影在线观看| 欧美猛男gaygay网站| 国产一区二区美女| 国产精品久线在线观看| 欧美日韩国产高清一区二区| 国产乱子轮精品视频| 亚洲国产成人91porn| 亚洲精品国产一区二区三区四区在线| 亚洲另类春色校园小说| 日韩一区二区三区免费观看| 成人一区二区视频| 亚洲妇女屁股眼交7| 久久蜜桃av一区二区天堂| 91香蕉国产在线观看软件| 五月天激情综合| 欧美一级精品大片| 99久久久国产精品| 青青国产91久久久久久| 国产精品不卡视频| 在线电影院国产精品| 国产+成+人+亚洲欧洲自线| 香蕉久久夜色精品国产使用方法 | 精品88久久久久88久久久| 99麻豆久久久国产精品免费| 日韩精品乱码免费| 亚洲视频电影在线| 久久久久久**毛片大全| 91精品欧美久久久久久动漫| 亚洲天堂2016| 六月丁香婷婷色狠狠久久| 狠狠色丁香久久婷婷综| 亚洲精品菠萝久久久久久久| 精品奇米国产一区二区三区| 91国在线观看| 国产成+人+日韩+欧美+亚洲| 美腿丝袜亚洲三区| 国产一本一道久久香蕉| 2020国产精品自拍| 99精品国产热久久91蜜凸| 亚洲欧美另类综合偷拍| 99久久国产综合精品女不卡| 亚洲无人区一区| 久久青草国产手机看片福利盒子 | 欧美大片免费久久精品三p| 99re66热这里只有精品3直播| 日韩av在线播放中文字幕| 亚洲黄色av一区| 欧美一区二区三区四区久久| 偷拍一区二区三区| 成人h版在线观看| 精品国免费一区二区三区| 国产一区中文字幕| 欧美电影免费观看高清完整版在线 | 国产亚洲一二三区| 国产精品99久久久久久有的能看| 在线播放一区二区三区| 国内不卡的二区三区中文字幕| 久久九九99视频| 欧美一区二区高清| 奇米综合一区二区三区精品视频| 欧美成人精品福利| 激情综合网最新| 自拍偷拍国产精品| 麻豆一区二区三区| 色婷婷综合久久久久中文一区二区| 蜜臀av性久久久久蜜臀aⅴ四虎 | 日韩欧美激情四射| 免费久久精品视频| 精品日韩成人av| 亚洲高清免费一级二级三级| eeuss鲁片一区二区三区 | 韩国女主播一区| 国内精品久久久久影院色| 精品在线免费观看| 国产成人免费xxxxxxxx| 成人免费看黄yyy456| 99久久久无码国产精品| 欧美一a一片一级一片| 丁香六月综合激情| 日产精品久久久久久久性色| 日韩毛片精品高清免费| 国产欧美一区二区精品忘忧草| 国产午夜精品美女毛片视频| 色欲综合视频天天天| 成人黄色电影在线| 国产成人综合自拍| 国产伦精品一区二区三区免费迷| 男女男精品视频| 欧美草草影院在线视频| 国产专区综合网| 国产成人av电影在线| 91视频观看免费| 在线亚洲人成电影网站色www| 色婷婷久久一区二区三区麻豆| 欧美日韩在线一区二区| www日韩大片| 一区二区三区在线免费观看| 蜜桃精品视频在线| 不卡av在线网| 欧美一级夜夜爽| 成人免费在线视频观看| 日产国产欧美视频一区精品| 成人综合在线观看| 欧美精品精品一区| 亚洲国产高清在线| 午夜不卡av免费| 春色校园综合激情亚洲| 7777精品久久久大香线蕉| 久久女同精品一区二区| 亚洲综合色自拍一区| 狠狠v欧美v日韩v亚洲ⅴ| 99综合影院在线| 精品欧美黑人一区二区三区| 一区二区在线观看视频在线观看| 久久国产三级精品| 91在线视频观看| 国产亚洲一区字幕| 丝袜亚洲另类丝袜在线| 亚洲国产经典视频| 日本美女视频一区二区| 91一区在线观看| 精品国产乱码久久久久久1区2区 | 久久色在线视频| 国产精品久久久久久亚洲毛片| 美女视频一区二区三区| av资源网一区| 欧美哺乳videos| 中文字幕精品三区| 成人91在线观看| 欧美日韩国产精选| 一区二区欧美国产| 国产精品99久久久久久有的能看 | 在线精品视频小说1| 久久婷婷色综合| 亚洲一卡二卡三卡四卡五卡| 国产成人精品在线看| 久久综合狠狠综合久久激情 | 国产一区二区三区黄视频| 在线观看91精品国产入口| 亚洲人成影院在线观看| 大胆亚洲人体视频| 综合久久一区二区三区| 另类综合日韩欧美亚洲| 欧美一区二区国产| 国产精品一卡二| 久久精品一区四区| 91污片在线观看| 日韩精品午夜视频| 青青草伊人久久| 91老师国产黑色丝袜在线| 韩国欧美国产1区| 精品夜夜嗨av一区二区三区| 在线成人午夜影院| 日韩电影在线一区二区三区|