日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

mysql not exists很慢_查询速度优化用not EXISTS 代替 not in

發布時間:2025/3/12 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mysql not exists很慢_查询速度优化用not EXISTS 代替 not in 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

exists : 強調的是是否返回結果集,不要求知道返回什么, 比如:

select name from student where sex = 'm' and mark exists(select 1 from grade where ...) ,只要

exists引導的子句有結果集返回,那么exists這個條件就算成立了,大家注意返回的字段始終為1,如果改成“select?2 from grade where ...”,那么返回的字段就是2,這個數字沒有意義。所以exists子句不在乎返回什么,而是在乎是不是有結果集返回。

而 exists 與 in 最大的區別在于 in引導的子句只能返回一個字段,比如:

select name from student where sex = 'm' and mark in (select 1,2,3 from grade where ...)

,in子句返回了三個字段,這是不正確的,exists子句是允許的,但in只允許有一個字段返回,在1,2,3中隨便去了兩個字段即可。

而not exists 和not in 分別是exists 和 in 的 對立面。

exists (sql 返回結果集為真)

not exists (sql 不返回結果集為真)

一種通俗的可以理解為:將外查詢表的每一行,代入內查詢作為檢驗,如果內查詢返回的結果取非空值,則EXISTS子句返回TRUE,這一行行可作為外查詢的結果行,否則不能作為結果。

分析器會先看語句的第一個詞,當它發現第一個詞是SELECT關鍵字的時候,它會跳到FROM關鍵字,然后通過FROM關鍵字找到表名并把表裝入內存。接著是找WHERE關鍵字,如果找不到則返回到SELECT找字段解析,如果找到WHERE,則分析其中的條件,完成后再回到SELECT分析字段。最后形成一張我們要的虛表。

WHERE關鍵字后面的是條件表達式。條件表達式計算完成后,會有一個返回值,即非0或0,非0即為真(true),0即為假(false)。同理WHERE后面的條件也有一個返回值,真或假,來確定接下來執不執行SELECT。

分析器先找到關鍵字SELECT,然后跳到FROM關鍵字將STUDENT表導入內存,并通過指針找到第一條記錄,接著找到WHERE關鍵字計算它的條件表達式,如果為真那么把這條記錄裝到一個虛表當中,指針再指向下一條記錄。如果為假那么指針直接指向下一條記錄,而不進行其它操作。一直檢索完整個表,并把檢索出來的虛擬表返回給用戶。EXISTS是條件表達式的一部分,它也有一個返回值(true或false)。

EXISTS與IN的使用效率的問題,通常情況下采用exists要比in效率高,因為IN不走索引,但要看實際情況具體使用:

IN適合于外表大而內表小的情況;EXISTS適合于外表小而內表大的情況。

總結

以上是生活随笔為你收集整理的mysql not exists很慢_查询速度优化用not EXISTS 代替 not in的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。