国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

平臺數據激增破千萬下的SQL優化

數據庫 其他數據庫
利用Explain,可以快速的分析出缺失的索引,比如檢查Join或者Order by中使用的字段,對于大表,有無索引會有幾十甚至上百倍的效率差異。但索引也并非越多越好,過多的索引會對插入及更新造成比較大的影響。

背景

公司一直維護著學生體測平臺,最近中標一個項目,從原本零零散散的錄入體測數據,驟增到幾天內上百萬的用戶及上千萬的體測數據涌入系統,結果各種異常、慢查、連接拒絕,層出不窮...

過多的慢sql會導致數據庫CPU飄升、連接無法及時釋放、連接池超出限制,原本幾毫秒的查詢也遲遲無法得到響應,拖垮整個系統,而且系統中使用了消息隊列,還導致了消息堆積,重啟服務后,服務瞬間又被打滿,內存飄升、頻繁的full GC...之前也整理過不少sql優化的文章,但沒多少用戶時,很少去關注,用戶驟增時,還是經歷了一番“洗禮”,這里記錄一下這幾天的優化點。

索引使用

索引優化,是一個老生常談的問題了。項目中,利用云平臺或者配合druid搭建慢sql報警機制,可以篩選出執行過慢的語句,然后,再借助explain去分析(有關explain的用法之前做過詳細講解:sql調優之explain關鍵字詳解)。

利用explain,可以快速的分析出缺失的索引,比如檢查join或者order by中使用的字段,對于大表,有無索引會有幾十甚至上百倍的效率差異。但索引也并非越多越好,過多的索引會對插入及更新造成比較大的影響。

explain之后,type為ALL的,即未使用到索引,多數還是比較容易處理的。這里順帶列舉一些常見的索引失效場景:

未遵循最左前綴匹配導致索引失效

使用函數導致索引失效

select * from student where name = left('云端行筆666',4)。

計算導致索引失效

select * from student where id + 1 = 666。

類型轉換導致索引失效

select * from student where convert(id,char) = '666'。

不等于(!= 或者<>)索引失效

select * from student where name != "云端行筆"。

like模糊匹配以通配符開頭導致索引失效

select * from student where name like "%云端行筆"。

索引字段使用is not null導致失效

select * from student where name is not null。

OR前后存在非索引的列,索引失效

select * from student where id =1 or name = '云端'。

這里列舉兩個此次優化的示例:

示例一:find_in_set

業務中有這樣一個場景,上級需要看到其所有下級的數據,如省及單位需要能查看其下所有市區縣的學校。為了方便,之前將學生所隸屬的學校以及其上級省市區單位,記錄在一個字段sponsor_ids中,然后通過find_in_set查詢,如下:

SELECT grade FROM enroll 
WHERE match_id = 60 AND FIND_IN_SET(36, sponsor_ids) 
GROUP BY grade ORDER BY grade

這樣設計,代碼寫起來很方便,但數據量級大是,查詢效率極其低下,因為find_in_set無法使用索引。

優化:事先查詢所屬下級,然后通過in查詢使用索引

SELECT
	s.id
FROM
( SELECT * FROM sponsor WHERE `status` = 1 AND  superior_id IS NOT NULL order by level asc ) s,
  ( SELECT @pid := #{sponsorId} ) pd
WHERE
FIND_IN_SET( superior_id, @pid ) != 0
AND @pid := concat( @pid, ',', id )
SELECT grade FROM enroll 
WHERE match_id = 60 AND  sponsor_id in (36) 
GROUP BY grade ORDER BY grade

雖然在查詢下級機構時,也使用了find_in_set,但機構表數據量有限,全表掃也無太大壓力,而enroll報名表使用in查詢后,效率明顯提升,由幾秒提升到幾十毫秒。

示例二:聯合索引

還有一些其他情況,比如:

SELECT sponsor_id, count(sponsor_id) AS sponsor_count FROM enroll 
WHERE match_id = 60 
GROUP BY sponsor_id

這句sql,是用于統計某次體測活動中,各個學校的報名人數。設計表時在match_id,sponsor_id上,分別建立的索引,報名人數不多時,效率還可以。但報名人數幾十萬之后,發現查詢效率明顯下降,需要幾秒鐘。explain分析如下:

從上述的分析可以看出,查詢使用了索引,但只用到了match_id這一個索引,而extra中顯示了using temporary,即使用了中間表進行分組,并未用到索引,數據量達到一定量級后,中間表也會很大,效率自然也就降低了。

為此,針對該查詢,建立了match_id和sponsor_id的聯合索引,explain發現,不在使用中間表,實際查詢效率也明顯提升,大概幾百毫秒。(使用到覆蓋索引,不需要回表查詢)

批量插入與更新(避免循環單條插入)

批量操作,是業務中很常見的,比如批量導入學生,簡單粗暴的一種做法就是,for循環,然后在循環中insert,如:

for (int i = 0; i < 50000; i++){
  Student student = new Student("云端行筆" + i,24,"北京市" + i,i + "號");
  studentMapper.insert(student);
}
<insert id="add" parameterType="com.peng.Student">
  INSERT INTO TEST(ID,Student) VALUES(#{id},#{student});
</insert>

當插入百八十條數據時,不會覺得效有多低,但當插入上萬條數據時,循環插入可能需要一兩分鐘甚至更久,這就無法忍受了。正確的打開方式:

<insert id="batchAdd" parameterType="java.util.List">
  INSERT INTO TEST(ID,Student)
VALUES
  <foreach collection="list" item="item" index="index" separator="," >
    (#{item.id},#{item.student})
    </foreach>
</insert>

避免全表

業務中有這樣一個需求,導入學生時,需要對比學生編號是否有重復。之前的實現方式是將student表中的所有數據,全都查出來,加載到內存,在內存中與導入的數據逐條對比。上百萬的數據,而且還是select *,結果可想而知...

這種掃全表、select *的做法,回頭來看,其實是很初級的,但實際開發中,很多時候,為了圖省事兒,可能就隨手把坑埋下去了...

無能為力的SQL

業務中有這樣一個場景:學生參與體測活動,需要報名,因此,除了student學生表之外,還有一張enroll報名表,用于記錄學生在多個體測活動中的報名狀態。業務中需要統計所有未報名的學校,思路很簡單,就是學生表和報名表取差集,然后統計差集中有哪些學校,SQL如下:

select distinct(s.sponsor_id) from student s
LEFT JOIN enroll e on e.student_id = s.id
where s.status = 1 and e.id is null

問題在于,一個地區會有幾百萬甚至上千萬的學生,如此龐大的兩張表取交集,太慢了.,優化好久也沒思路...(歡迎評論區指點迷津)。SQL無力了,最終選擇,將未報名的學校數據提前統計計算,放在緩存之中,有學生狀態或者報名狀態發生變更,則去更新。該思路也是類似于數據平臺,千萬級別的數據,實時統計,肯定會有效率問題,因此,往往會在數據服務中非實時計算。

總結

以上是平臺數據爆發期間,優化項目是的一些感悟,隨筆一記。

責任編輯:姜華 來源: 今日頭條
相關推薦

2022-10-14 17:24:35

MySQLSQL優化

2022-07-05 21:31:21

索引SQL分庫分表

2017-02-05 17:27:43

2010-03-23 11:55:32

云計算

2012-09-24 10:20:24

草根應用平臺數據

2023-11-30 15:10:20

物聯網數據物聯網平臺

2018-03-30 14:30:10

數據庫SQL語句性能優化

2018-07-30 14:40:01

MySQLSQL查詢

2019-05-31 12:03:06

SQLHadoop大數據

2022-07-04 23:24:28

sql優化監控

2012-12-26 09:23:56

數據庫優化

2024-03-11 07:38:15

歐拉數據血緣數據應用數據治理

2014-04-09 14:15:23

2023-02-24 16:37:04

MySQL數據查詢數據庫

2018-07-11 20:07:06

數據庫MySQL索引優化

2023-07-26 08:21:33

2015-07-14 17:12:49

2009-12-02 10:33:34

LINQ to SQL

2010-09-10 13:37:30

表分區SQL Server

2016-12-09 09:31:22

HadoopSQL大數據
點贊
收藏

51CTO技術棧公眾號

日韩三级在线播放| 国产精品自在欧美一区| 一本色道久久综合亚洲精品酒店| 亚洲女人****多毛耸耸8| 91九色国产视频| 欧美综合影院| 色综合久久久久综合体| 成人免费淫片95视频观看网站| 一本大道色婷婷在线| 忘忧草在线影院两性视频| 亚洲免费激情| 成人国产精品免费观看动漫| 欧美三区免费完整视频在线观看| 亚洲九九九在线观看| 91九色蝌蚪成人| 毛片av在线| 亚洲在线电影| 国产亚洲精品综合一区91| 九九免费精品视频在线观看| 亚洲国产精品免费| 在线看片地址| 亚洲国产日韩在线| 国产经品一区二区| 欧美综合视频| 国产成人精品国内自产拍免费看| 中文字幕在线视频网站| 欧美私人免费视频| 欧美日本韩国一区二区| 亚洲一区二区三区四区在线免费观看| 成人免费性视频| 国产精品1024久久| 国产一区二区网| 美女日韩在线中文字幕| ts人妖另类在线| 精品国产18久久久久久洗澡| 91精品国产沙发| 精品福利在线| 国产精品啪视频| 日本成人在线电影网| 成人日韩在线电影| 国产美女在线观看一区| jizzjizzjizz亚洲女| 中文字幕乱码久久午夜不卡| 校园春色 亚洲色图| 亚洲福利国产精品| h视频在线免费| 日韩成人激情视频| 卡一精品卡二卡三网站乱码 | 又黄又爽的视频在线观看| 欧美怡红院视频| 黄网站视频在线观看| 精品日韩一区二区| 精品免费视频| 97中文字幕在线| 在线观看亚洲专区| 黄色影院在线看| 久久久久久国产精品| 久久精品国产99| 超碰96在线| 色一情一乱一区二区| 一本一本久久| 污网站在线播放| 亚洲精品www| 久热精品在线| 狠狠热免费视频| 中文字幕在线成人| 蜜桃av一区二区三区| 中文字幕第88页| 自拍在线观看| 国产有码在线一区二区视频| 久久电影国产免费久久电影 | 视频一区中文| 五月综合网站| 欧美精品一区二区三| 日韩一区二区三区色| 日本在线播放一区| 色综合久久天天| 精品在线观看入口| 成年人黄视频网站| 亚洲精品福利免费在线观看| 国产精品乱战久久久| 欧美老熟妇喷水| 中文字幕v亚洲ⅴv天堂| 欧美久久九九| 国产超碰在线播放| 精品国内亚洲在观看18黄| 91啪九色porn原创视频在线观看| 国产高潮在线| 伊人婷婷久久| 亚洲香蕉成人av网站在线观看 | 日韩视频在线你懂得| 日本黄色a视频| 欧美性生活一区| 水蜜桃久久夜色精品一区的特点| 久久国产精品高清一区二区三区| 青青精品视频播放| 国产精品久久毛片| 国产劲爆久久| 日本xxxx黄色| 国产精品丝袜久久久久久不卡| 亚洲成a人v欧美综合天堂 | 亚洲欧洲在线一区| 日韩最新中文字幕电影免费看| 欧美精品一区二区三区久久| 粉嫩久久99精品久久久久久夜| 亚洲免费一区| 欧美变态xxxx| 日韩高清国产一区在线观看| 国产亚洲免费的视频看| 亚洲精品视频在线观看免费 | 91亚洲永久免费精品| 亚洲成人777| 成人直播在线| 日韩高清专区| 中文字幕亚洲欧美| 一区二区三区加勒比av| 日韩国产高清影视| 国产香蕉精品| 久久五月精品中文字幕| 亚洲狼人综合干| 国产精品二区三区四区| 亚洲免费av网址| 欧美高清精品3d| 亚洲一区二区精品视频| 成人手机在线视频| 亚洲美女黄色| 九九免费精品视频在线观看| 本网站久久精品| 99在线播放| 免费人成黄页在线观看忧物| 亚洲色欲综合一区二区三区| 日韩国产一区久久| 国产精品麻豆免费版| 国产成人亚洲综合91| 深夜福利亚洲导航| 日韩免费高清av| 五月综合激情婷婷六月色窝| 中文字幕不卡一区| 久久天天做天天爱综合色| 国内精品视频666| 丝袜诱惑亚洲看片| 香蕉成人久久| 国产精品啊啊啊| 欧美日韩综合| 亚洲有吗中文字幕| 亚洲激情在线| 久久精品九九| 蜜桃久久精品一区二区| 青草av.久久免费一区| 免费av网站大全久久| 韩国毛片一区二区三区| 国产91丝袜在线播放| 成人av片在线观看| 中日韩免费视频中文字幕| 一区二区三区日韩欧美精品| 亚洲尤物在线视频观看| 亚洲综合色丁香婷婷六月图片| 亚洲一卡二卡三卡四卡五卡| 亚洲mv在线观看| 欧美中文字幕一区二区三区| 欧美一区二区三区在线看| 日韩国产高清视频在线| 日韩在线小视频| 国产精品极品在线| 免费看成人午夜电影| 青青在线免费观看| 精品久久久久久久无码| 极品白浆推特女神在线观看 | 欧美成人免费| 69堂免费精品视频在线播放| 国产一区二区三区电影在线观看| 欧美黄色免费| 久久香蕉国产线看观看99| 欧美三级视频在线| 国产丝袜一区二区| 国产精品久久久久久一区二区| 日本在线观看一区| 色视频www在线播放| 伊人久久大香线蕉综合影院首页| 日韩dvd碟片| 久久久www成人免费毛片麻豆 | 午夜精品福利电影| 伊人av成人| wwwxxx在线观看| 牛牛影视一区二区三区免费看| 欧美日韩1区| 精品人伦一区二区三区蜜桃网站 | 亚洲自拍高清视频网站| 五月婷婷深爱五月| 黄色精品视频| 激情综合色丁香一区二区| 欧美三级中文字幕在线观看| 97国产精品人人爽人人做| 黄色大片中文字幕| 国产精品高清乱码在线观看| 日一区二区三区| 欧美人伦禁忌dvd放荡欲情| 国产97在线播放| 人猿泰山h版在线观看| 人人香蕉久久|