15.查詢優(yōu)化和子查詢 半查詢(gold_axe)

一些重寫規(guī)則

  • 移除沒用的括號
  • 常量傳遞(確定值換成對應常數(shù))
  • 移除明顯沒用的條件
  • 表達式計算
  • Having移到where
  • 常量表

唯一索引的等值查詢,被任務查詢的時間少到可忽略,


這里table1就是常量表, 假設 table1.primary_key = 1 這行是 1,a語句就會被優(yōu)化為SELECT * FROM 1,a INNER JOIN table2 ON a= table2.column2

  • 外連接和內(nèi)連接效果一樣轉(zhuǎn)內(nèi)連接

子查詢

類型按結果分:

  • 標量子查詢 : 子查詢子返回一個值
  • 子查詢:
  • 子查詢:
  • 子查詢

按與外層關系分:

相關查詢

這里,子查詢里面的條件的n1t1的表, 子查詢用到外面表的列

子查詢結果集的布爾表達式
  • IN
  • ANY/SOME



    等價于


  • ALL (同意可換成極值)
  • EXISTS


    如果子查詢結果集有記錄就是 ture

IN子查詢優(yōu)化

SELECT * FROM s1 WHERE key1 IN (SELECT common_field FROM s2 WHERE key3 = 'a');

物化表

SELECT * FROM s1 WHERE key1
SELECT common_field FROM s2 WHERE key3 = 'a'
這2個查的是 s1 s2 2張表, 不相關的查詢
內(nèi)層查詢的結果集太多, 可能內(nèi)存發(fā)不下,而且 in(這里面太多) 效率太低,
所以, 內(nèi)層查詢的結果會被放到臨時表里面, 這個過程會去重(瘦身), 這個過程叫物化

  • 一般是 基于內(nèi)存的 Memory表, hash索引
  • 太大了(超過系統(tǒng)變量設置的大小) 只能用基于磁盤的存儲引擎, 索引的B+

semi-join 半連接

SELECT s1.* FROM s1 SEMI JOIN s2 ON s1.key1 = s2.common_field WHERE key3 = 'a';
這個語句不能執(zhí)行只做示意
半連接:只關心在s2表中是否存在與之匹配的記錄是否存在脓鹃,而不關心具體有多少條記錄與之匹配

執(zhí)行半連接如何消除重復值:

  • Table pullout (子查詢中的表上拉):
    比如
    SELECT * FROM s1 WHERE key2 IN (SELECT key2 FROM s2 WHERE key3 = 'a');因為key2在表2里面是唯一的, 可以變成
    SELECT s1.* FROM s1 INNER JOIN s2 ON s1.key2 = s2.key2WHERE s2.key3 = 'a';
  • DuplicateWeedout execution strategy (重復值消除)
    會建立一個臨時表, 臨時表只有一個列 id, 是主鍵, 把s1查詢出來的結果的id插入這個臨時表, 如果插成功的, 就是不重復的, 記入結果集
  • LooseScan execution strategy (松散索引掃描)
    SELECT * FROM s1
    WHERE key3 IN (SELECT key1 FROM s2 WHERE key1 > 'a' AND key1 < 'b');
    可以轉(zhuǎn)換成
    SELECT * FROM s1 INNER JOIN s2 ON s1.key3 = s2.key1 WHERE s2.key1 > 'a' AND s2.key1 < 'b'
    以s2為驅(qū)動表, 先走s2的 key1上的索引 找到 s2.key1 > 'a' AND s2.key1 < 'b', 然后 相同的key1 只取第一個 比如

in 子查詢 轉(zhuǎn)成 EXISTS

SELECT
    *
FROM
    s1
WHERE
    key1 IN (
        SELECT
            key3
        FROM
            s2
        WHERE
            s1.common_field = s2.common_field
    )
OR key2 > 1000;
SELECT
    *
FROM
    s1
WHERE
    EXISTS (
        SELECT
            1
        FROM
            s2
        WHERE
            s1.common_field = s2.common_field
        AND s2.key3 = s1.key1// 可以用到s2.key3上的索引了
    )
OR key2 > 1000;

如果IN子查詢不滿足轉(zhuǎn)換為semi-join的條件把将,又不能轉(zhuǎn)換為物化表或者轉(zhuǎn)換為物化表的成本太大,那么它就會被轉(zhuǎn)換為EXISTS查詢。

派生表消除

SELECT
    *
FROM
    (SELECT * FROM s1 WHERE key1 = 'a') AS derived_s1// 派生表
INNER JOIN s2 ON derived_s1.key1 = s2.key1
WHERE
    s2.key2 = 1;
SELECT
    *
FROM
    s1
INNER JOIN s2 ON s1.key1 = s2.key1
WHERE
    s1.key1 = 'a'
AND s2.key2 = 1;
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吃谣,一起剝皮案震驚了整個濱河市伐蒂,隨后出現(xiàn)的幾起案子烙博,更是在濱河造成了極大的恐慌百揭,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奕剃,死亡現(xiàn)場離奇詭異衷旅,居然都是意外死亡,警方通過查閱死者的電腦和手機纵朋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進店門柿顶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人操软,你說我怎么就攤上這事嘁锯。” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵家乘,是天一觀的道長蝗羊。 經(jīng)常有香客問我,道長仁锯,這世上最難降的妖魔是什么耀找? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮业崖,結果婚禮上野芒,老公的妹妹穿的比我還像新娘。我一直安慰自己双炕,他們只是感情好狞悲,可當我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著妇斤,像睡著了一般摇锋。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上趟济,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天乱投,我揣著相機與錄音,去河邊找鬼顷编。 笑死,一個胖子當著我的面吹牛剑刑,可吹牛的內(nèi)容都是我干的媳纬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼施掏,長吁一口氣:“原來是場噩夢啊……” “哼钮惠!你這毒婦竟也來了?” 一聲冷哼從身側響起七芭,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤素挽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后狸驳,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體预明,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年耙箍,在試婚紗的時候發(fā)現(xiàn)自己被綠了撰糠。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辩昆,死狀恐怖阅酪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤术辐,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布砚尽,位于F島的核電站,受9級特大地震影響辉词,放射性物質(zhì)發(fā)生泄漏必孤。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一较屿、第九天 我趴在偏房一處隱蔽的房頂上張望隧魄。 院中可真熱鬧,春花似錦隘蝎、人聲如沸购啄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽狮含。三九已至,卻和暖如春曼振,著一層夾襖步出監(jiān)牢的瞬間几迄,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工冰评, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留映胁,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓甲雅,卻偏偏與公主長得像解孙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子抛人,可洞房花燭夜當晚...
    茶點故事閱讀 44,781評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 1 標量子查詢弛姜、行子查詢的執(zhí)行方式 我們經(jīng)常在下邊兩個場景中使用到標量子查詢或者行子查詢: SELECT子句中,我...
    括兒之家閱讀 362評論 0 0
  • 具體細節(jié) 請去掘金購買《MySQL 是怎樣運行的:從根兒上理解 MySQL》 mysql會優(yōu)化我們的查詢條件進行優(yōu)...
    簡書徐小耳閱讀 799評論 1 0
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,451評論 0 13
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,325評論 0 10
  • ORACLE自學教程 --create tabletestone ( id number, --序號usernam...
    落葉寂聊閱讀 1,081評論 0 0