mysql中explain對含union的sql顯示了錯誤的索引結(jié)果

近期收到服務器報警环戈,發(fā)現(xiàn)有條sql在執(zhí)行的時候,耗時很長竟然能有30s多。
數(shù)據(jù)庫版本5.6.28 千康。sql 如下:

-- focus news 庫
SELECT*FROM news_basic WHERE id !=18762279 AND 
(publish_time< '2017-06-02 09:31:25' OR (publish_time='2017-06-02 09:31:25' AND id< 18762279)) 
AND STATUS IN (1,7) AND source IN (11,12,13) AND city_id=380
 AND category IN (43,52,1201,1202,1203,1204) ORDER BY publish_time DESC,id DESC LIMIT 1) 
UNION ALL (
SELECT*FROM news_basic WHERE id !=18762279 AND 
(publish_time> '2017-06-02 09:31:25' OR (publish_time='2017-06-02 09:31:25' AND id> 18762279)) 
AND STATUS IN (1,7) AND source IN (11,12,13) AND city_id=380 
AND category IN (43,52,1201,1202,1203,1204) ORDER BY publish_time ASC,id ASC LIMIT 1);

這條sql 功能是找到id=18762279的文章的相鄰的上下篇文章各一篇悴务。其中2017-06-02 09:31:25是id=18762279文章的發(fā)布時間睹限。

這條sql看起來很復雜,怕出現(xiàn)慢查詢所以explain看了下執(zhí)行計劃讯檐。


執(zhí)行計劃

如圖可見羡疗,索引走的是城市+類別(index_city_id_category)的聯(lián)合索引。
那根據(jù)索引坐下group by裂垦,看下每個小類別有多少條數(shù)據(jù)顺囊。

SELECT city_id ,count(*) from news_basic WHERE   category IN (43,52,1201,1202,1203,1204)  GROUP BY city_id
image.png

image.png

可以看出,熱門城市文章數(shù)較多蕉拢,檢索可能會較慢特碳,但萬條數(shù)據(jù)還算ok。city_id=380的城市應該是個冷門城市晕换,小分類下只有一百條午乓。那為什么sql為什么執(zhí)行了那么長時間呢?闸准?
30s上下的執(zhí)行時間應該是掃描了百萬級數(shù)據(jù)益愈。

我開始懷疑mysql 的explain在“騙人”。

mysql根本沒走指定的索引夷家!
那我對union的兩個子句坐下explain怎么樣蒸其。

EXPLAIN 
SELECT*FROM news_basic WHERE id !=18762279 AND (publish_time< '2017-06-02 09:31:25' OR (publish_time='2017-06-02 09:31:25' AND id< 18762279)) AND STATUS IN (1,7) AND source IN (11,12,13) AND city_id=380 AND category IN (43,52,1201,1202,1203,1204) ORDER BY publish_time DESC,id DESC LIMIT 1;
EXPLAIN  
SELECT*FROM news_basic WHERE id !=18762279 AND (publish_time> '2017-06-02 09:31:25' OR (publish_time='2017-06-02 09:31:25' AND id> 18762279)) AND STATUS IN (1,7) AND source IN (11,12,13) AND city_id=380 AND category IN (43,52,1201,1202,1203,1204) ORDER BY publish_time ASC,id ASC LIMIT 1;
索引采用publish_time

好嘛,索引都走publish_time库快,掃描行數(shù)到底291萬行……

優(yōu)化方法

優(yōu)化方法比較常規(guī)摸袁,可以force index,也可以ignore index(publish_time)义屏。

(
SELECT*FROM news_basic  force index(index_city_id_category)  WHERE   id !=18762279 AND (publish_time< '2017-06-02 09:31:25' OR (publish_time='2017-06-02 09:31:25' AND id< 18762279)) AND STATUS IN (1,7) AND source IN (11,12,13) AND city_id=380 AND category IN (43,52,1201,1202,1203,1204) ORDER BY publish_time DESC,id DESC LIMIT 1) UNION ALL (
SELECT*FROM news_basic    force index(index_city_id_category)  WHERE id !=18762279 AND (publish_time> '2017-06-02 09:31:25' OR (publish_time='2017-06-02 09:31:25' AND id> 18762279)) AND STATUS IN (1,7) AND source IN (11,12,13) AND city_id=380 AND category IN (43,52,1201,1202,1203,1204) ORDER BY publish_time ASC,id ASC LIMIT 1);

(
SELECT*FROM news_basic IGNORE INDEX (publish_time)  WHERE id !=18762279 AND (publish_time< '2017-06-02 09:31:25' OR (publish_time='2017-06-02 09:31:25' AND id< 18762279)) AND STATUS IN (1,7) AND source IN (11,12,13) AND city_id=380 AND category IN (43,52,1201,1202,1203,1204) ORDER BY publish_time DESC,id DESC LIMIT 1) UNION ALL (
SELECT*FROM news_basic IGNORE INDEX (publish_time) WHERE id !=18762279 AND (publish_time> '2017-06-02 09:31:25' OR (publish_time='2017-06-02 09:31:25' AND id> 18762279)) AND STATUS IN (1,7) AND source IN (11,12,13) AND city_id=380 AND category IN (43,52,1201,1202,1203,1204) ORDER BY publish_time ASC,id ASC LIMIT 1);

兩種優(yōu)化的結(jié)果都很明顯靠汁,查詢時間達到0.089s和 0.015s蜂大。
explain 計劃顯示都使用了索引index_city_id_category。


union子句的執(zhí)行計劃

最后

目前的困惑在于如果explain給出的結(jié)果是有錯誤的蝶怔,那之后優(yōu)化sql語句時可以相信的工具是什么呢……
查了許久奶浦,沒有google到mysql做union操作時explain結(jié)果不正確的相關案例。
但是在git上發(fā)現(xiàn)了類似例子:有人分享了索引失效選擇time索引的案例踢星,也是掃描了百萬行數(shù)據(jù)澳叉。很可惜的是該例子沒有做union操作,也無法對比union的explain結(jié)果斩狱。

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耳高,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子所踊,更是在濱河造成了極大的恐慌泌枪,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件秕岛,死亡現(xiàn)場離奇詭異碌燕,居然都是意外死亡,警方通過查閱死者的電腦和手機继薛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門修壕,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人遏考,你說我怎么就攤上這事慈鸠。” “怎么了灌具?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵青团,是天一觀的道長。 經(jīng)常有香客問我咖楣,道長督笆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任诱贿,我火速辦了婚禮娃肿,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘珠十。我一直安慰自己料扰,他們只是感情好,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布焙蹭。 她就那樣靜靜地躺著晒杈,像睡著了一般。 火紅的嫁衣襯著肌膚如雪壳嚎。 梳的紋絲不亂的頭發(fā)上桐智,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天,我揣著相機與錄音烟馅,去河邊找鬼说庭。 笑死,一個胖子當著我的面吹牛郑趁,可吹牛的內(nèi)容都是我干的刊驴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼寡润,長吁一口氣:“原來是場噩夢啊……” “哼捆憎!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起梭纹,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤躲惰,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后变抽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體础拨,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年绍载,在試婚紗的時候發(fā)現(xiàn)自己被綠了诡宗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡击儡,死狀恐怖塔沃,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情阳谍,我是刑警寧澤蛀柴,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站边坤,受9級特大地震影響名扛,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜茧痒,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一肮韧、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧旺订,春花似錦弄企、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至樱调,卻和暖如春约素,著一層夾襖步出監(jiān)牢的瞬間届良,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工圣猎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留士葫,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓送悔,卻偏偏與公主長得像慢显,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子欠啤,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

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

  • explain關鍵字可以模擬優(yōu)化器執(zhí)行SQL語句荚藻,從而知道MySQL是 如何處理你的SQL語句的。分析你的查詢語句...
    Chting閱讀 1,541評論 0 2
  • 一洁段、MySQL優(yōu)化 MySQL優(yōu)化從哪些方面入手: (1)存儲層(數(shù)據(jù)) 構(gòu)建良好的數(shù)據(jù)結(jié)構(gòu)应狱。可以大大的提升我們S...
    寵辱不驚丶歲月靜好閱讀 2,440評論 1 8
  • 面試題5:union all 和 union的區(qū)別 Union:對兩個結(jié)果集進行并集操作祠丝,不包括重復行侦香,同時進行默...
    行者和他的鋼筆閱讀 940評論 0 1
  • 遠方是一株株直立高挺的樹污朽,連綿成一條不流暢的曲線將低矮的夕陽遠遠地遮住散吵。景色靜暖,那夕陽從黑色的樹身后面透...
    阿蒜堇堇閱讀 268評論 2 3
  • 步入中年,以前每天都要在鏡子面前照上半天炎功,現(xiàn)在唯愿活在美圖秀秀里枚冗。 賈寶玉說女人出嫁前是無價寶珠,慢慢不知道為什么...
    杉杉媽媽閱讀 774評論 16 16