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

一個20秒SQL慢查詢優化的經歷與處理方案

數據庫 SQL Server
前幾天在項目上線過程中,發現有一個頁面無法正確獲取數據,經排查原來是接口調用超時,而最后發現是因為SQL查詢長達到20多秒而導致了問題的發生。這里,沒有高深的理論或技術,只是備忘一下經歷和解讀一些思想誤區。

背景

前幾天在項目上線過程中,發現有一個頁面無法正確獲取數據,經排查原來是接口調用超時,而最后發現是因為SQL查詢長達到20多秒而導致了問題的發生。

這里,沒有高深的理論或技術,只是備忘一下經歷和解讀一些思想誤區。

復雜SQL語句的構成

這里不過多對業務功能進行描述,但為了突出問題所在,會用類比的語句來描述當時的場景。復雜的SQL語句可以表達如下:

 

  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 

 

關聯查詢

從上面簡化的SQL語句,可以看出,首先進行的是關聯查詢。

子查詢

其次,是嵌套的子查詢。此子查詢是為了找出多個用戶共同擁有的組ID。所以語句中的“100,102,103”是根據場景來定的,并且需要和后面“count(id) > 3”的個數對應。簡單來說,就是找用戶交集的組ID。

耗時在哪?

假設現在a_table表的數據量為20W,而b_table的數據量為2000W。大家可以想一下,你覺得主要的耗時是在關聯查詢部分,還是在子查詢部分?

(思考空間。。。。)

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

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

問題定位

對于SQL底層的原理和高深的理論,我暫時掌握不夠深入。但我知道可以通過類比和簡單的測試來驗證是哪一塊環節出了問題。

初步斷定

首先,對于只有一個用戶ID時,我會把上面的語句簡化成:

 

  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) 

 

所以,初步斷定應該是嵌套的子查詢部分占用了大部分的時間。

#p#

再進一步驗證

既然定位到了是嵌套的子查詢語句的問題,那又要分為兩塊待排查的區域:是子查詢本身耗時大,還是嵌套而導致慢查詢?

結果很容易發現,當我把子查詢單獨在DB中執行時,是非常快的。所以排除。

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

但因為處于上線緊急的過程中,為了確保,我快速地驗證了我的結論:

1、將子查詢的ID單獨執行,并把得到的結果序列手動拼成一段ID,如:1,2,3,4, ... , 999

2、將上面得到的序列ID,手動替換到原來的SQL語句

3、執行,發現,很快!只用了約150 ms

Well Done! 準備修復上線!

解決方案

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

另外一個需要注意的點

當前,實際的SQL語句,會比這個更為復雜,但已足以表達問題所在。但在前期,筆者也做了一些SQL的代碼。

因為b_table比a_table大,所以一開始 b_table 左關聯 a_table 時,很慢,大概是1秒多,而且數據量是很少的;但若反過來,a_table 左關聯 b_table 時,則很快,大概是100毫秒。

所以,又發現一個有趣的現象:

大表 左關聯 小表,很慢;小表 左關聯 大表,很快。

當然,這些我們理論上都知道,但實際開發會忘卻。又或者一開始兩個表都為空時,而又沒考慮到后期這兩個表增長的速度時,日后就會埋下坑了。

總結

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

原因,我還沒仔細去研究,但在下班的路上和我的同事交流時,他說曾經看過這方面相關的書籍,是說每一次的子查詢都會產生一個SQL語句,所以就N次查詢了。而另外一位資深的QA同事則跟我說,應該是M*N的問題。

其次,我一開始使用嵌套子查詢,是存在這樣一個誤區:我覺得將這些操作交給MySQL自身來處理會更高效,畢竟DB內部會有良好的機制來執行這些查詢由。

然后,實際表白,我錯了。因為這不是簡單的合并MC批量查詢。

當我們決定使用一些底層的技術時,只有當我們理解透徹了,才能使用更為恰當。而因為無知就斷定工具、框架、底層無所不能時,往往就會中招。

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

責任編輯:Ophira 來源: 開源中國博客
相關推薦

2017-05-23 16:26:26

MySQL優化處理

2020-02-10 10:15:31

技術研發指標

2020-05-12 20:40:58

SQL慢查詢優化數據庫

2022-07-14 14:46:51

數據庫SQL系統設計

2010-06-29 09:56:00

SQL Server查

2011-04-02 16:45:58

SQL Server查詢優化

2010-07-01 14:23:25

SQL Server查

2011-04-06 11:34:52

SQL Server數查詢優化

2009-07-06 08:19:11

內向女生求職經歷

2010-07-09 09:08:43

2021-07-30 07:28:16

SQL優化日志

2011-08-18 15:03:47

SQL Server多優化方案

2010-07-05 17:00:39

SQL server

2024-02-22 16:55:13

2022-04-22 14:41:12

美團慢查詢數據庫

2011-06-28 08:32:40

MySQL慢查詢日志

2020-11-23 11:40:35

MySQSQL數據庫

2010-11-09 15:30:01

Sql server時

2017-11-08 14:07:45

數據庫MySQL慢查分析

2010-07-09 08:46:34

SQL Server查
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩视频在线免费观看 | 成人在线观看免费视频 | 在线免费观看毛片 | 中文字幕在线精品 | av在线电影网站 | 久久久久久国产精品mv | 日韩成人影院在线观看 | 午夜精品| 黄色网页在线观看 | 中文字幕视频在线看5 | 日韩在线免费视频 | 国产精品二区三区 | 久久一区二区三区四区 | 亚洲精品国产偷自在线观看 | 日韩免费高清视频 | 亚洲综合在线网 | 爱爱免费视频 | 欧美激情久久久 | 久久综合一区 | 欧美在线观看一区 | 欧美久久一区二区 | 丁香久久 | 久久国产精品一区二区 | 午夜在线精品偷拍 | 一区二区三区网站 | 春色av| 亚洲高清av在线 | 日韩欧美字幕 | 羞羞视频在线网站观看 | 99久久久99久久国产片鸭王 | 武道仙尊动漫在线观看 | 久久久久久一区 | 精品成人 | 一区二区视频在线 | 99精品网| 日本在线一二 | 中文字幕在线看 | 午夜电影福利 | 欧美精品一区在线 | 91 视频网站| av片免费观看 |