亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

分析MySQL鐘not exists與索引的關系

發布時間:2020-09-04 14:55:41 來源:億速云 閱讀:401 作者:小新 欄目:MySQL數據庫

這篇文章主要介紹分析MySQL鐘not exists與索引的關系,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

在一些業務場景中,會使用NOT EXISTS語句確保返回數據不存在于特定集合,部分同事會發現NOT EXISTS有些場景性能較差,甚至有些網上謠言說”NOT EXISTS不走索引”,哪對于NOT EXISTS語句,我們如何優化呢?

以今天優化的SQL為例,優化前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方式進行優化,優化后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

優化效果:

優化前執行時間29秒以上,優化后1.2秒,優化提升25倍。

NOT EXISTS真的不走索引么?

查看兩種SQL的執行計劃!

使用NOT EXIST方式的執行計劃:

使用LEFT JOIN方式的執行計劃:

從執行計劃來看,兩個表都使用了索引,區別在于NOT EXISTS使用“DEPENDENT SUBQUERY”方式,而LEFT JOIN使用普通表關聯的方式。

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

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

使用NOT EXIST方式的執行過程:

使用LEFT JOIN方式的執行過程:

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

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

從上面執行過程可以推斷出:

使用NOT EXISTS方式的執行性能嚴重依賴于NOT EXISTS子查詢的執行次數即外層查詢結果集的數據量。

  1. 當外層查詢結果集的數據量N較小時執行性能較好,如有N=10執行時間為50μs*10=500us=0.005s,再加上一些額外消耗,執行結果也能在0.01秒或10毫秒內范圍,這個響應時間應該能被大部分應用程序接受。

  2. 當外層程勛結果集的數據量N較大甚至上千萬數據量時,NOT EXISTS的查詢性能會變得非常糟糕,甚至會大量消耗服務器IO和CPU資源從而影響其他業務正常運行。

除上述問題外,在優化過程中發現本應該存儲相同數據的resource_id列在兩個表中定義不同,一表為VARCHAR而另外一表為BIGINT,外部結果集的字段類型和NOT EXIST字表中字段類型不同導致NOT EXISTS子查詢中無法使用索引,使得子查詢性能較差,最終影響整個查詢的執行性能。

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

以上是分析MySQL鐘not exists與索引的關系的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

射洪县| 临海市| 蒙阴县| 东阿县| 水富县| 津南区| 福海县| 东莞市| 红安县| 民丰县| 巫溪县| 依安县| 五家渠市| 沈丘县| 岢岚县| 马山县| 永安市| 曲水县| 绥化市| 铅山县| 呈贡县| 楚雄市| 察哈| 静乐县| 安陆市| 开江县| 平利县| 镇巴县| 临城县| 鄂伦春自治旗| 长汀县| 通辽市| 东丰县| 行唐县| 理塘县| 德清县| 黎城县| 石柱| 南昌县| 阿拉尔市| 竹山县|