求求你別再用COUNT(*)判斷數(shù)據(jù)存不存在了,很浪費(fèi)資源的
引言
在日常業(yè)務(wù)系統(tǒng)開(kāi)發(fā)中,我們嘗嘗有這樣的一個(gè)需求:判斷某個(gè)值在數(shù)據(jù)庫(kù)中是否存在。常見(jiàn)的做法之一是使用COUNT(*)或者COUNT(1)函數(shù),但是,在僅需判斷記錄是否存在而不關(guān)注具體數(shù)量的情況下,采用EXISTS子句或LIMIT 1查詢往往能提供更高的查詢性能和更低的系統(tǒng)資源消耗。
COUNT()函數(shù)的局限性
使用COUNT(*)或者COUNT(1)先查詢出來(lái)這個(gè)值在數(shù)據(jù)庫(kù)中對(duì)應(yīng)的記錄的行數(shù),然后在代碼中判斷sql返回的數(shù)據(jù)條數(shù)是否大于0,即可確認(rèn)是否存在。
SELECT COUNT(*) FROM t_order WHERE order_no = 'c535cd19-9d1d-46';
然后代碼中判斷:
int count = orderMapper.countOrder(orderNo);
if (count > 0){
System.out.println("單號(hào)已存在");
}else{
System.out.println("單號(hào)不存在");
}
雖然這種寫(xiě)法沒(méi)有問(wèn)題,能得到是否大于0的結(jié)論,可以實(shí)現(xiàn)業(yè)務(wù)需求,但是呢,COUNT(*)會(huì)遍歷所有滿足條件的行,即便你并不關(guān)心具體的行數(shù),也會(huì)消耗較大的系統(tǒng)資源。特別是當(dāng)表的數(shù)據(jù)量非常大時(shí),這種查詢可能導(dǎo)致性能瓶頸。盡管在有適當(dāng)索引的情況下,MySQL可以有效地處理COUNT(*)查詢,但在僅需判斷是否存在的情況下,利用索引的優(yōu)勢(shì)不如EXISTS和LIMIT 1明顯。并且EXISTS和LIMIT 1也可以利用索引。
關(guān)于COUNT()函數(shù)更多的介紹,請(qǐng)移步:面試官:請(qǐng)說(shuō)一下Mysql中count(1)、count(*)以及count(列)的區(qū)別?
EXISTS子句的優(yōu)勢(shì)
EXISTS子句是用來(lái)檢查是否存在滿足條件的行。例如上述示例修改為:
SELECT EXISTS(SELECT id FROM t_order WHERE order_no = 'c535cd19-9d1d-46');
執(zhí)行結(jié)果:
圖片
EXISTS子句內(nèi)的查詢返回至少一行數(shù)據(jù)時(shí),它將立刻返回TRUE(即1)。這意味著一旦找到匹配項(xiàng),MySQL就可以停止進(jìn)一步的掃描,因此在只需判斷記錄是否存在時(shí),其性能表現(xiàn)優(yōu)于COUNT(*)。EXISTS子句更適合于復(fù)雜的嵌套查詢中,作為邏輯判斷條件。
關(guān)于EXISTS子句更多的介紹,請(qǐng)移步:面試官:Mysql中EXISTS與IN有哪些使用差異?
LIMIT 1 優(yōu)勢(shì)
LIMIT的用法就不多介紹了。而LIMIT 1查詢?cè)谡业降谝粭l滿足條件的記錄時(shí)就結(jié)束搜索。
SELECT id FROM t_order WHERE order_no = 'c535cd19-9d1d-46' LIMIT 1;
圖片
LIMIT 1查詢同樣會(huì)在找到第一條滿足條件的記錄時(shí)就結(jié)束搜索,因此在判斷是否存在記錄時(shí)具備很高的效率。并且,與EXISTS相比,LIMIT 1還額外提供了匹配記錄的具體信息。這對(duì)于那些在判斷存在性的同時(shí)還需要獲取記錄部分內(nèi)容或全部?jī)?nèi)容的場(chǎng)景來(lái)說(shuō),是一個(gè)理想的解決方案。
適用場(chǎng)景
- EXISTS適用于只需要知道記錄是否存在的情況,尤其適合在復(fù)雜查詢的子查詢中作為條件判斷。
- LIMIT 1適用于在確定記錄存在時(shí)同時(shí)需要獲取該記錄部分或全部數(shù)據(jù)的場(chǎng)合。
- COUNT(*)在需要統(tǒng)計(jì)滿足特定條件的記錄總數(shù)時(shí)更為適用。
總結(jié)
在僅僅需要判斷數(shù)據(jù)庫(kù)中是否存在滿足特定條件的記錄時(shí),使用EXISTS子句或帶有LIMIT 1的查詢不僅能夠提高查詢效率,減少資源消耗,還能根據(jù)需求靈活地獲取相關(guān)數(shù)據(jù)。盡管COUNT(*)在統(tǒng)計(jì)記錄數(shù)量上有其不可替代的價(jià)值,但在判斷記錄是否存在這一特定任務(wù)上,我們應(yīng)該優(yōu)先考慮更加高效且針對(duì)性強(qiáng)的EXISTS和LIMIT 1查詢策略。這樣才能更好地優(yōu)化數(shù)據(jù)庫(kù)性能,提升應(yīng)用響應(yīng)速度。