亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > MySQL > 正文

MySQL的一條慢SQL查詢導致整個網站宕機的解決方法

2024-07-24 13:10:04
字體:
來源:轉載
供稿:網友

直接切入正題吧:

通常來說,我們看到的慢查詢一般還不致于導致掛站,頂多就是應用響應變慢
不過這個恰好今天被我撞見了,一個慢查詢把整個網站搞掛了
先看看這個SQL張撒樣子:

# Query_time: 70.472013 Lock_time: 0.000078 Rows_sent: 7915203 Rows_examined: 15984089 Rows_affected: 0
# Bytes_sent: 1258414478
use js_sku;
SET timestamp=1465850117;
SELECT 
ss_id, ss_sa_id, ss_si_id, ss_av_zid, ss_av_fid, ss_artno,
ss_av_zvalue, ss_av_fvalue, ss_av_zpic, ss_av_fpic, ss_number,
ss_sales, ss_cprice, ss_price, ss_stock, ss_orderid, ss_status,
ss_add_time, ss_lastmodify
FROM js_sgoods_sku
WHERE ss_si_id = 0 AND ss_status > 0
ORDER BY
ss_orderid DESC, ss_av_fid ASC;
這里貼出來的就是 mysql slow log 的信息,查詢時間用了高達 70s!!
看到慢查詢我們一般第一反應是這個 語句沒有用到索引? 或者是索引不合理么? 那我們會去看看執行計劃:

mysql> explain SELECT 
-> ss_id, ss_sa_id, ss_si_id, ss_av_zid, ss_av_fid, ss_artno,
-> ss_av_zvalue, ss_av_fvalue, ss_av_zpic, ss_av_fpic, ss_number,
-> ss_sales, ss_cprice, ss_price, ss_stock, ss_orderid, ss_status,
-> ss_add_time, ss_lastmodify
-> FROM js_sgoods_sku
-> WHERE ss_si_id = 0 AND ss_status > 0
-> ORDER BY
-> ss_orderid DESC, ss_av_fid ASC;
+----+-------------+---------------+------+---------------+----------+---------+-------+---------+-----------------------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+---------------+------+---------------+----------+---------+-------+---------+-----------------------------+
| 1 | SIMPLE | js_sgoods_sku | ref | ss_si_id | ss_si_id | 4 | const | 9516091 | Using where; Using filesort |
+----+-------------+---------------+------+---------------+----------+---------+-------+---------+-----------------------------+
1 row in set (0.00 sec)

這個看起來似乎用到了索引,可是為什么掃描到行還是這么多呢? 那我們就去看看表結構了,期望能從中找到點有價值的東西:
我們看到如下可用信息:
KEY `ss_si_id` (`ss_si_id`,`ss_av_zid`,`ss_av_fid`) USING BTREE,
`ss_si_id` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '對應js_sgoods_info.si_id',

我們看到 索引似乎還能比較能夠接受,但是我們看到 這個 ss_si_id 這個字段實際上是 goods_info 表的主鍵,也就是說它的離散程度應該是很大的,也就是區分度很大。
其實到這一步我們基本上可以認為 是由于我們這個表里邊有很多 ss_si_id=0 導致,不過我們可以進一步的來證實我們的猜想:

1. 首先我們可以先確定我們的統計信息沒有問題
2. 其次我們再count ss_si_id=0 的這個值有多少數據,來進一步驗證我們的猜想。

那么我們先查看以下這個索引的統計信息:
xiean@localhost:js_sku 03:27:42>show index from js_sgoods_sku;
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| js_sgoods_sku | 0 | PRIMARY | 1 | ss_id      | A | 18115773 | NULL | NULL | | BTREE | | |
| js_sgoods_sku | 1 | ss_si_id | 1 | ss_si_id   | A  | 1811577  | NULL | NULL | | BTREE | | |
| js_sgoods_sku | 1 | ss_si_id | 2 | ss_av_zid | A | 6038591  | NULL | NULL | | BTREE | | |
| js_sgoods_sku | 1 | ss_si_id | 3 | ss_av_fid | A | 18115773 | NULL | NULL | | BTREE | | |
| js_sgoods_sku | 1 | IDX_001 | 1 | ss_sa_id | A | 3623154   | NULL | NULL | | BTREE | | |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

那么可以看到以下問題:
我們的ss_si_id 這個字段并沒有我們表面上看到的 因為關聯了某個表的主鍵,它的Cardinality 值就應該接近于 PRIMARY 的值。而是差別比較大的,難道是 索引的統計信息不準確? 那我們嘗試重新收集下索引的統計信息:
xiean@localhost:js_sku 03:27:47>analyze table js_sgoods_sku;
+----------------------+---------+----------+----------+
| Table | Op | Msg_type | Msg_text |
+----------------------+---------+----------+----------+
| js_sku.js_sgoods_sku | analyze | status | OK |
+----------------------+---------+----------+----------+

but ,我們再次查看 這些索引的統計信息:
xiean@localhost:js_sku 03:28:14>show index from js_sgoods_sku;
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| js_sgoods_sku | 0 | PRIMARY | 1 | ss_id      | A | 18621349 | NULL | NULL | | BTREE | | |
| js_sgoods_sku | 1 | ss_si_id | 1 | ss_si_id    | A | 1551779  | NULL | NULL | | BTREE | | |
| js_sgoods_sku | 1 | ss_si_id | 2 | ss_av_zid | A | 6207116   | NULL | NULL | | BTREE | | |
| js_sgoods_sku | 1 | ss_si_id | 3 | ss_av_fid | A | 18621349 | NULL | NULL | | BTREE | | |
| js_sgoods_sku | 1 | IDX_001 | 1 | ss_sa_id | A | 3724269   | NULL | NULL | | BTREE | | |
+---------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

我們可以看到 ss_si_id 的離散程度(Cardinality) 沒有增加反而有向下波動的趨勢,因為這個信息是采集部分頁的來的,而每個頁上邊數據分布是不一樣的,導致我們這個索引收集的統計信息就回有所變化。

好吧,到這里我們可以認為我們的 統計信息沒有失效,那么我們就看數據的分別情況咯:

+--------------++----------++------------------+
| ss_si_id=0; || count(*) || 7994788/19048617 |
+--------------++----------++------------------+
| 7994788     || 19048617 ||    0.4197           |
+--------------++----------++------------------+

額,不看不知道,一看嚇一跳:我們這個表里邊 存在有大量的 ss_si_id=0 的情況,占了整個表數據量的 41% ?。?!


好吧問題找到了,那么接下來我們需要知道,為什么這個SQL語句會導致掛站呢?

我們通過觀看應用程序服務器的監控看到一些信息:我們的 goods_service 這個服務異常:異常情況如下:

1. cpu 長期占用100% + 
2. jstatck pid 無法dump 內存堆棧信息,必須強制dump -F
3. dump 出來的內存信息發現,這個進程里邊所有線程 均處于 BLOCKED 狀態
4. 通過jstat -gcutil 看到 FGC 相當頻繁,10s左右就FGC一次
5. 內存占用超過了分配的內存

那么最終的原因就是因為上邊的慢查詢 查詢了大量數據(最多有700w行數據),導致goods_service 內存暴漲,出現服務無法響應,進一步的惡化就是掛占


OK,知道了為什么會掛占,那么我們是如何解決這個問題的呢?
既然我們知道是由于查詢了 ss_si_id=0 導致的,那么我們屏蔽掉這個SQL不就好了么。屏蔽的辦法可以有多種:
1. 我們程序邏輯判斷一下這類型的 查詢 如果 有查詢 ss_si_id=0 的一律封殺掉
2. 我們改改SQL配置文件,修改SQL語句

我們發現DB服務器上存在大量的 這個慢查詢,而且DB服務器負載已經從 0.xx 飆升到了 50+ 了,隨之而來的連接數也飆升的厲害, 如果再不及時處理,估計DB服務器也掛掉了

 

那么我們最終采取以下處理辦法:
1.運維配合研發修改SQL語句 我們在這個WHERE 條件中添加了一個條件: AND ss_si_id <> 0 ,在MySQL之行計劃層屏蔽掉此SQL;
2.DBA 開啟kill 掉這個查詢語句,避免DB服務器出現down機的情況,當然這個就用到了我們的 pt-kill 工具,不得不說這個工具相當好用


總結(經驗與教訓):
1.類似這種查詢 default 值的 SQL ,我們應該從源頭上杜絕這類查詢
2.限制查詢結果集大小,避免因查詢結果集太大導致服務死掉

 

注:相關教程知識閱讀請移步到MYSQL教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲精品欧美日韩专区| 国产精品高潮粉嫩av| 久精品免费视频| 欧美激情啊啊啊| 亚洲福利视频网站| 亚洲一级片在线看| 奇米影视亚洲狠狠色| 国产不卡在线观看| 在线视频亚洲欧美| 久久人人爽人人爽人人片av高清| 91亚洲精品在线观看| 亚洲成人精品视频在线观看| 国产在线999| 国产在线观看一区二区三区| 欧美高清不卡在线| 精品av在线播放| 国产精品欧美激情| 亚洲电影av在线| 日韩欧美第一页| 91精品国产91久久久久久不卡| 国产成人精品一区二区在线| 欧亚精品在线观看| 欧美xxxx18性欧美| 亚洲综合精品一区二区| 久久久精品免费| 国产精品爽爽ⅴa在线观看| 欧美视频专区一二在线观看| 亚洲女人天堂成人av在线| 国产成人一区二区三区电影| 精品久久久久久久中文字幕| 久久久久久中文| 久久久av一区| 亚洲第一在线视频| 午夜精品久久久久久久久久久久| 国产精品免费一区豆花| 中文字幕成人精品久久不卡| 久久久久久久久久久人体| 亚洲精品中文字幕有码专区| 国产精品美女久久久免费| 久久久女人电视剧免费播放下载| 俺也去精品视频在线观看| 亚洲精品小视频在线观看| 日韩乱码在线视频| 成人国产在线激情| 一区二区三区美女xx视频| 在线播放日韩专区| 欧美一级视频在线观看| 亚洲一区二区少妇| 国产午夜精品一区理论片飘花| 国产精品私拍pans大尺度在线| 久久99久国产精品黄毛片入口| 国内精品美女av在线播放| 蜜月aⅴ免费一区二区三区| 九九精品在线视频| 精品视频久久久久久| 久久精品久久精品亚洲人| 热久久免费视频精品| 性色av一区二区三区| 久久久亚洲网站| 久久久久久欧美| 久久精品亚洲94久久精品| 性欧美激情精品| 国产成人精品亚洲精品| 精品欧美一区二区三区| 91欧美精品午夜性色福利在线| 色七七影院综合| 久久久av亚洲男天堂| 国产成人精品在线视频| www.欧美三级电影.com| 色哟哟亚洲精品一区二区| 亚洲精品女av网站| 亚洲人av在线影院| 日韩精品小视频| 国产精品毛片a∨一区二区三区|国| 欧美日韩在线免费| 亚洲三级黄色在线观看| 日韩欧美在线网址| 欧美成人精品不卡视频在线观看| 9.1国产丝袜在线观看| 亚洲一区二区三区香蕉| 久久久久999| 欧美肥臀大乳一区二区免费视频| 欧美激情中文网| 久久久亚洲欧洲日产国码aⅴ| 欧洲成人在线观看| 亚洲一品av免费观看| 中文字幕久热精品视频在线| 色中色综合影院手机版在线观看| 亚洲香蕉成人av网站在线观看| 欧美激情va永久在线播放| 欧美性xxxx在线播放| 中文字幕在线成人| 亚洲一区二区三区久久| 国产精品2018| 国产精品成人品| 国产精选久久久久久| 91色中文字幕| 亚洲偷熟乱区亚洲香蕉av| 日韩一级裸体免费视频| 久久精品99无色码中文字幕| 日韩在线观看精品| 国产精品久久久久免费a∨大胸| 久久影视免费观看| 97精品国产97久久久久久| 欧美视频免费在线观看| 成人激情在线观看| 久久影院中文字幕| 色偷偷噜噜噜亚洲男人的天堂| 国产精品美女无圣光视频| 26uuu另类亚洲欧美日本老年| 一本一本久久a久久精品牛牛影视| 亚洲香蕉av在线一区二区三区| 国产成人自拍视频在线观看| www.欧美精品一二三区| 81精品国产乱码久久久久久| 欧美伦理91i| 亚洲人成在线观看网站高清| 久久99视频精品| 精品无码久久久久久国产| 欧美激情视频一区二区| 97在线观看免费| 欧美丝袜一区二区| 欧美激情xxxx| 成人黄色片网站| 国产精品自产拍在线观| 欧美天堂在线观看| 成人日韩在线电影| 欧美在线观看网站| 久久久久久91| 欧美亚洲激情在线| 欧美日韩中文字幕综合视频| 久久综合久久八八| 国产欧美va欧美va香蕉在| 红桃视频成人在线观看| 蜜臀久久99精品久久久久久宅男| 992tv成人免费影院| 欧美大学生性色视频| 国产成人午夜视频网址| 91久久精品视频| 久久久久久午夜| 在线精品高清中文字幕| 免费av在线一区| 欧美亚洲午夜视频在线观看| 欧美裸体xxxx| 久久久久久这里只有精品| 久久久噜久噜久久综合| 国产精品大片wwwwww| 欧美巨猛xxxx猛交黑人97人| 精品欧美激情精品一区| 亚洲人成欧美中文字幕| 91在线色戒在线| 亚洲最大在线视频| 日本高清+成人网在线观看| 亚洲国语精品自产拍在线观看| 欧美二区在线播放| 欧美孕妇性xx| 久久久国产视频| 国产精品自拍小视频| 日韩天堂在线视频| 精品国产依人香蕉在线精品| 久久人91精品久久久久久不卡| 亚洲三级免费看| 国产精品久久精品| 亚洲欧美激情一区|