sql查詢語句的優化,exists與in的更換

小站的頁面訪問查詢的速度一直不讓人滿意,恰好今天有時間,就決定對它優化一下。 mysql

由於在本地開時發,查詢的速度是至關快的,一開始就覺得是mysql版本的問題,本地是MariaDB 5.5,服務器上是mysql 5.1, sql

將服務器上的數據弄到本地導了一份,竟然發現同樣變慢了,平均查詢一個文章要1-2秒,列表超過2秒以上,才幾千的數據這麼慢確定是哪裏出了問題。 xcode

一點一點的定位打印日誌,最後發現,竟然是一條使用了exists的sql語句,查詢就用了2秒,也就是說時間都花在這個上了,其它的基本均可以忽略了,語句以下: 服務器

select * from TERM t where  exists (select t2.TERM_ID from ASS_POST_TERM t2 where t.TERM_ID = t2.TERM_ID and t2.POST_ID = ?)

文章和分類的關聯,這個語句沒什麼特別的地方,分開執行都是零點零幾毫秒,拼在一塊兒竟然要2秒,難以想象。 優化

難道是這個exists影響了嗎?將exist換成in試一下: 日誌

select * from TERM t where  t.TERM_ID in (select t2.TERM_ID from ASS_POST_TERM t2 where t2.POST_ID = ?)

立馬見效,查詢時間從2秒提高爲零點1毫秒左右,還真是這個exists的緣故。 code

網上都說exists的效率要高於in或才not in,看來也不盡然,具體狀況還得具體分析啊,像在這裏就比in差了20倍不止。 get

看來要好好研究一個exists這個關鍵字了。 class

相關文章
相關標籤/搜索