淺談mysql的子查詢聯(lián)合與in的效率
最近的產(chǎn)品測(cè)試發(fā)現(xiàn)一個(gè)問題,當(dāng)并發(fā)數(shù)量小于10時(shí),響應(yīng)時(shí)間可以維持在100毫秒以內(nèi)。但是當(dāng)并發(fā)數(shù)到達(dá)30個(gè)時(shí),響應(yīng)時(shí)間就超過1秒。這太不能接受了,要求是通過1秒中并發(fā)100個(gè)。
經(jīng)過檢測(cè)發(fā)現(xiàn),時(shí)間主要是耗在其中的一個(gè)存儲(chǔ)過程中。把存儲(chǔ)過程的語句一條一條的過一遍也沒有發(fā)現(xiàn)明顯的不合理。因?yàn)閙ysql本身不能提供毫秒級(jí)別的時(shí)間,google了一個(gè)mysql的能提供毫秒的時(shí)間函數(shù),再做測(cè)試,做了一個(gè)定位。發(fā)現(xiàn)是其中一條語句,語句是這個(gè)樣子:
select .... from A, B where .....and A.id in (select id from C where ...);
in 子查詢語句的結(jié)果很少,就幾條。explain 這條語句,也沒有什么問題。單條測(cè)試也沒有問題。但是當(dāng)并發(fā)數(shù)大時(shí)問題就出來了。
做了個(gè)改變:
select ... from A,B,(select ... from C where ...) S where ....;
再做測(cè)試,性能大為改觀。50個(gè)并發(fā)與10個(gè)并發(fā)幾乎是相同的響應(yīng)速度。
在mysql中,mysql可能都建議改成使用子查詢的聯(lián)合,而不用in。以前沒有經(jīng)過實(shí)驗(yàn)?,F(xiàn)在終于看見其中的效率了。當(dāng)然,也不能盡相信。還是得根據(jù)自己的應(yīng)用來。最好是能做一些測(cè)試和實(shí)驗(yàn)。
總結(jié)
以上就是本文關(guān)于淺談mysql的子查詢聯(lián)合與in的效率的全部?jī)?nèi)容,希望對(duì)大家有所幫助。
感興趣的朋友可以參考:
幾個(gè)比較重要的MySQL變量
MySQL主庫binlog(master-log)與從庫relay-log關(guān)系代碼詳解
mysql數(shù)據(jù)庫開發(fā)規(guī)范【推薦】
有什么問題歡迎留言,大家一起交流討論。在此也希望朋友們對(duì)本站網(wǎng)站多多支持!
版權(quán)聲明:本站文章來源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來,僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信