成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

一個(gè)20秒SQL慢查詢優(yōu)化的經(jīng)歷與處理方案

數(shù)據(jù)庫(kù) SQL Server
前幾天在項(xiàng)目上線過程中,發(fā)現(xiàn)有一個(gè)頁(yè)面無(wú)法正確獲取數(shù)據(jù),經(jīng)排查原來(lái)是接口調(diào)用超時(shí),而最后發(fā)現(xiàn)是因?yàn)镾QL查詢長(zhǎng)達(dá)到20多秒而導(dǎo)致了問題的發(fā)生。這里,沒有高深的理論或技術(shù),只是備忘一下經(jīng)歷和解讀一些思想誤區(qū)。

背景

前幾天在項(xiàng)目上線過程中,發(fā)現(xiàn)有一個(gè)頁(yè)面無(wú)法正確獲取數(shù)據(jù),經(jīng)排查原來(lái)是接口調(diào)用超時(shí),而最后發(fā)現(xiàn)是因?yàn)镾QL查詢長(zhǎng)達(dá)到20多秒而導(dǎo)致了問題的發(fā)生。

這里,沒有高深的理論或技術(shù),只是備忘一下經(jīng)歷和解讀一些思想誤區(qū)。

復(fù)雜SQL語(yǔ)句的構(gòu)成

這里不過多對(duì)業(yè)務(wù)功能進(jìn)行描述,但為了突出問題所在,會(huì)用類比的語(yǔ)句來(lái)描述當(dāng)時(shí)的場(chǎng)景。復(fù)雜的SQL語(yǔ)句可以表達(dá)如下:

 

  1. SELECT * FROM a_table AS a  
  2. LEFT JOIN b_table AS b ON a.id=b.id  
  3. WHERE a.id IN ( 
  4.     SELECT DISTINCT id FROM a_table  
  5.     WHERE user_id IN (100,102,103) GROUP BY user_id HAVING count(id) > 3 

 

關(guān)聯(lián)查詢

從上面簡(jiǎn)化的SQL語(yǔ)句,可以看出,首先進(jìn)行的是關(guān)聯(lián)查詢。

子查詢

其次,是嵌套的子查詢。此子查詢是為了找出多個(gè)用戶共同擁有的組ID。所以語(yǔ)句中的“100,102,103”是根據(jù)場(chǎng)景來(lái)定的,并且需要和后面“count(id) > 3”的個(gè)數(shù)對(duì)應(yīng)。簡(jiǎn)單來(lái)說,就是找用戶交集的組ID。

耗時(shí)在哪?

假設(shè)現(xiàn)在a_table表的數(shù)據(jù)量為20W,而b_table的數(shù)據(jù)量為2000W。大家可以想一下,你覺得主要的耗時(shí)是在關(guān)聯(lián)查詢部分,還是在子查詢部分?

(思考空間。。。。)

(思考空間。。。。 。。。)

(思考空間。。。。 。。。 。。。)

問題定位

對(duì)于SQL底層的原理和高深的理論,我暫時(shí)掌握不夠深入。但我知道可以通過類比和簡(jiǎn)單的測(cè)試來(lái)驗(yàn)證是哪一塊環(huán)節(jié)出了問題。

初步斷定

首先,對(duì)于只有一個(gè)用戶ID時(shí),我會(huì)把上面的語(yǔ)句簡(jiǎn)化成:

 

  1. SELECT * FROM a_table AS a  
  2. LEFT JOIN b_table AS b ON a.id=b.id  
  3. WHERE user_id IN (100) 

 

所以,初步斷定應(yīng)該是嵌套的子查詢部分占用了大部分的時(shí)間。

#p#

再進(jìn)一步驗(yàn)證

既然定位到了是嵌套的子查詢語(yǔ)句的問題,那又要分為兩塊待排查的區(qū)域:是子查詢本身耗時(shí)大,還是嵌套而導(dǎo)致慢查詢?

結(jié)果很容易發(fā)現(xiàn),當(dāng)我把子查詢單獨(dú)在DB中執(zhí)行時(shí),是非常快的。所以排除。

剩下的不言而喻,20秒的慢查詢是嵌套引起的。

但因?yàn)樘幱谏暇€緊急的過程中,為了確保,我快速地驗(yàn)證了我的結(jié)論:

1、將子查詢的ID單獨(dú)執(zhí)行,并把得到的結(jié)果序列手動(dòng)拼成一段ID,如:1,2,3,4, ... , 999

2、將上面得到的序列ID,手動(dòng)替換到原來(lái)的SQL語(yǔ)句

3、執(zhí)行,發(fā)現(xiàn),很快!只用了約150 ms

Well Done! 準(zhǔn)備修復(fù)上線!

解決方案

線上的問題,很多時(shí)間都是在定位問題和分析原因,既然問題找到了,原因也找到了,解決方案不言而喻。代碼簡(jiǎn)單處理即可。

另外一個(gè)需要注意的點(diǎn)

當(dāng)前,實(shí)際的SQL語(yǔ)句,會(huì)比這個(gè)更為復(fù)雜,但已足以表達(dá)問題所在。但在前期,筆者也做了一些SQL的代碼。

因?yàn)閎_table比a_table大,所以一開始 b_table 左關(guān)聯(lián) a_table 時(shí),很慢,大概是1秒多,而且數(shù)據(jù)量是很少的;但若反過來(lái),a_table 左關(guān)聯(lián) b_table 時(shí),則很快,大概是100毫秒。

所以,又發(fā)現(xiàn)一個(gè)有趣的現(xiàn)象:

大表 左關(guān)聯(lián) 小表,很慢;小表 左關(guān)聯(lián) 大表,很快。

當(dāng)然,這些我們理論上都知道,但實(shí)際開發(fā)會(huì)忘卻。又或者一開始兩個(gè)表都為空時(shí),而又沒考慮到后期這兩個(gè)表增長(zhǎng)的速度時(shí),日后就會(huì)埋下坑了。

總結(jié)

首先,嵌套的子查詢是很慢的。

原因,我還沒仔細(xì)去研究,但在下班的路上和我的同事交流時(shí),他說曾經(jīng)看過這方面相關(guān)的書籍,是說每一次的子查詢都會(huì)產(chǎn)生一個(gè)SQL語(yǔ)句,所以就N次查詢了。而另外一位資深的QA同事則跟我說,應(yīng)該是M*N的問題。

其次,我一開始使用嵌套子查詢,是存在這樣一個(gè)誤區(qū):我覺得將這些操作交給MySQL自身來(lái)處理會(huì)更高效,畢竟DB內(nèi)部會(huì)有良好的機(jī)制來(lái)執(zhí)行這些查詢由。

然后,實(shí)際表白,我錯(cuò)了。因?yàn)檫@不是簡(jiǎn)單的合并MC批量查詢。

當(dāng)我們決定使用一些底層的技術(shù)時(shí),只有當(dāng)我們理解透徹了,才能使用更為恰當(dāng)。而因?yàn)闊o(wú)知就斷定工具、框架、底層無(wú)所不能時(shí),往往就會(huì)中招。

博文出處:http://my.oschina.net/dogstar/blog/398879
 

責(zé)任編輯:Ophira 來(lái)源: 開源中國(guó)博客
相關(guān)推薦

2017-05-23 16:26:26

MySQL優(yōu)化處理

2020-02-10 10:15:31

技術(shù)研發(fā)指標(biāo)

2020-05-12 20:40:58

SQL慢查詢優(yōu)化數(shù)據(jù)庫(kù)

2022-07-14 14:46:51

數(shù)據(jù)庫(kù)SQL系統(tǒng)設(shè)計(jì)

2010-06-29 09:56:00

SQL Server查

2011-04-02 16:45:58

SQL Server查詢優(yōu)化

2010-07-01 14:23:25

SQL Server查

2011-04-06 11:34:52

SQL Server數(shù)查詢優(yōu)化

2010-07-09 09:08:43

2009-07-06 08:19:11

內(nèi)向女生求職經(jīng)歷

2021-07-30 07:28:16

SQL優(yōu)化日志

2011-08-18 15:03:47

SQL Server多優(yōu)化方案

2010-07-05 17:00:39

SQL server

2024-02-22 16:55:13

2011-06-28 08:32:40

MySQL慢查詢?nèi)罩?/a>

2022-04-22 14:41:12

美團(tuán)慢查詢數(shù)據(jù)庫(kù)

2020-11-23 11:40:35

MySQSQL數(shù)據(jù)庫(kù)

2010-11-09 15:30:01

Sql server時(shí)

2017-11-08 14:07:45

數(shù)據(jù)庫(kù)MySQL慢查分析

2010-07-09 08:46:34

SQL Server查
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 久久天天躁狠狠躁夜夜躁2014 | 午夜精品久久久久久久久久久久 | 国产一区二区三区四区三区四 | 欧美黄视频 | 亚洲国产精品va在线看黑人 | 欧美日本一区 | 亚洲综合色 | 免费三级网站 | 韩日三级| 国产欧美一区二区三区在线看蜜臀 | 91精品成人久久 | 亚洲国产一区二区三区 | 亚洲va欧美va人人爽午夜 | 天天干天天爽 | 一区二区三区视频在线观看 | 国产成人久久av免费高清密臂 | 国产免费又色又爽又黄在线观看 | 三级黄色片在线播放 | 91国内精精品久久久久久婷婷 | 成人av在线大片 | 色婷婷激情综合 | 毛片免费视频 | 日韩欧美国产成人一区二区 | 涩涩鲁亚洲精品一区二区 | 成人免费视频网址 | 北条麻妃一区二区三区在线观看 | 操人视频在线观看 | 99精品视频网 | 欧美啊v在线观看 | 成人亚洲精品久久久久软件 | 中文字幕在线一区二区三区 | 国产精品一区二区在线免费观看 | 久久乐国产精品 | www,黄色,com | 日韩国产在线 | 国产在线视频一区二区 | 黑人精品欧美一区二区蜜桃 | 亚洲视频免费在线观看 | www.青青草| 亚洲精品2| 亚洲国产精品99久久久久久久久 |