中文字幕日韩精品一区二区免费_精品一区二区三区国产精品无卡在_国精品无码专区一区二区三区_国产αv三级中文在线

MySQLnotexists與索引的關(guān)系

在一些業(yè)務(wù)場景中,會使用NOT EXISTS語句確保返回?cái)?shù)據(jù)不存在于特定集合,部分同事會發(fā)現(xiàn)NOT EXISTS有些場景性能較差,甚至有些網(wǎng)上謠言說”NOT EXISTS不走索引”,哪對于NOT EXISTS語句,我們?nèi)绾蝺?yōu)化呢?

三水網(wǎng)站建設(shè)公司創(chuàng)新互聯(lián),三水網(wǎng)站設(shè)計(jì)制作,有大型網(wǎng)站制作公司豐富經(jīng)驗(yàn)。已為三水上千家提供企業(yè)網(wǎng)站建設(shè)服務(wù)。企業(yè)網(wǎng)站搭建\成都外貿(mào)網(wǎng)站建設(shè)要多少錢,請找那個售后服務(wù)好的三水做網(wǎng)站的公司定做!

以今天優(yōu)化的SQL為例,優(yōu)化前SQL為:

SELECT count(1) FROM t_monitor m WHERE NOT exists (  SELECT 1   FROM t_alarm_realtime AS a   WHERE a.resource_id=m.resource_id   AND a.resource_type=m.resource_type   AND a.monitor_name=m.monitor_name)

我們使用LEFT JOIN方式進(jìn)行優(yōu)化,優(yōu)化后SQL為:

SELECT count(1) FROM t_monitor m LEFT JOIN t_alarm_realtime AS a    ON a.resource_id=m.resource_id   AND a.resource_type=m.resource_type   AND a.monitor_name=m.monitor_name WHERE a.resource_id is NULL

優(yōu)化效果:

優(yōu)化前執(zhí)行時間29秒以上,優(yōu)化后1.2秒,優(yōu)化提升25倍。

NOT EXISTS真的不走索引么?

查看兩種SQL的執(zhí)行計(jì)劃!

使用NOT EXIST方式的執(zhí)行計(jì)劃:

使用LEFT JOIN方式的執(zhí)行計(jì)劃:

從執(zhí)行計(jì)劃來看,兩個表都使用了索引,區(qū)別在于NOT EXISTS使用“DEPENDENT SUBQUERY”方式,而LEFT JOIN使用普通表關(guān)聯(lián)的方式。

推薦看下:為什么索引能提高查詢速度?

通過MySQL提供的Profiling方式來查看兩種方式的執(zhí)行過程。

使用NOT EXIST方式的執(zhí)行過程:

使用LEFT JOIN方式的執(zhí)行過程:

從執(zhí)行過程來看,LEFT JOIN方式的主要消耗在Sending data一項(xiàng)上(1.2s),而NOT EXISTS方式主要消耗在executeing和Sending data兩項(xiàng)上,受限于Profiling只存放100行記錄緣故。

從Profiling中只能看到47個” executeing和Sending data”的組合項(xiàng)(每個組合項(xiàng)約50us),通過執(zhí)行計(jì)劃看出,外表t_monitor的數(shù)據(jù)量為578436行,忽略統(tǒng)計(jì)信息不準(zhǔn)情況下,使用NOT EXISTS方式應(yīng)該會產(chǎn)生578436個” executeing和Sending data”的組合項(xiàng),總計(jì)消耗時間=50μs*578436=28921800us=28.92s。

從上面執(zhí)行過程可以推斷出:

使用NOT EXISTS方式的執(zhí)行性能嚴(yán)重依賴于NOT EXISTS子查詢的執(zhí)行次數(shù)即外層查詢結(jié)果集的數(shù)據(jù)量。

當(dāng)外層查詢結(jié)果集的數(shù)據(jù)量N較小時執(zhí)行性能較好,如有N=10執(zhí)行時間為50μs*10=500us=0.005s,再加上一些額外消耗,執(zhí)行結(jié)果也能在0.01秒或10毫秒內(nèi)范圍,這個響應(yīng)時間應(yīng)該能被大部分應(yīng)用程序接受。

當(dāng)外層程勛結(jié)果集的數(shù)據(jù)量N較大甚至上千萬數(shù)據(jù)量時,NOT EXISTS的查詢性能會變得非常糟糕,甚至?xí)罅肯姆?wù)器IO和CPU資源從而影響其他業(yè)務(wù)正常運(yùn)行。

除上述問題外,在優(yōu)化過程中發(fā)現(xiàn)本應(yīng)該存儲相同數(shù)據(jù)的resource_id列在兩個表中定義不同,一表為VARCHAR而另外一表為BIGINT,外部結(jié)果集的字段類型和NOT EXIST字表中字段類型不同導(dǎo)致NOT EXISTS子查詢中無法使用索引,使得子查詢性能較差,最終影響整個查詢的執(zhí)行性能。

京東商城也曾出現(xiàn)過大量類似案例,一些表使用VARCHAR來存放訂單號,而另一些表使用BIGINT來存放,在兩表進(jìn)行管理時性能極差,希望研發(fā)同事引以為戒。關(guān)注公眾號Java技術(shù)棧回復(fù)m36獲取一份MySQL研發(fā)軍規(guī)。

相關(guān)學(xué)習(xí)推薦:mysql視頻教程

分享名稱:MySQLnotexists與索引的關(guān)系
當(dāng)前URL:http://www.rwnh.cn/article22/cpdhcc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供面包屑導(dǎo)航、用戶體驗(yàn)虛擬主機(jī)、ChatGPT網(wǎng)站維護(hù)、網(wǎng)站排名

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

逊克县| 桐柏县| 凤城市| 远安县| 江油市| 收藏| 朝阳县| 家居| 庆云县| 前郭尔| 宜兰市| 商都县| 巴南区| 腾冲县| 建平县| 安吉县| 佛冈县| 五原县| 浪卡子县| 清水河县| 西乌珠穆沁旗| 台中县| 恭城| 沁阳市| 昌图县| 普格县| 南投市| 大理市| 山阳县| 邵阳市| 如皋市| 阜南县| 古交市| 上思县| 徐水县| 满洲里市| 建阳市| 玉田县| 绿春县| 澄城县| 鹿邑县|