自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

SQL查找是否"存在",別再用count了

運(yùn)維 數(shù)據(jù)庫(kù)運(yùn)維
根據(jù)某一條件從數(shù)據(jù)庫(kù)表中查詢『有』與『沒(méi)有』,只有兩種狀態(tài),那為什么在寫(xiě) SQL 的時(shí)候,還要 SELECT COUNT(*) 呢?

根據(jù)某一條件從數(shù)據(jù)庫(kù)表中查詢『有』與『沒(méi)有』,只有兩種狀態(tài),那為什么在寫(xiě) SQL 的時(shí)候,還要 SELECT COUNT(*) 呢?

[[355458]]

圖片來(lái)自 Pexels

無(wú)論是剛?cè)氲赖某绦騿T新星,還是精湛沙場(chǎng)多年的程序員老白,都是一如既往的 COUNT。

目前多數(shù)人的寫(xiě)法

多次 REVIEW 代碼時(shí),發(fā)現(xiàn)如現(xiàn)現(xiàn)象:業(yè)務(wù)代碼中,需要根據(jù)一個(gè)或多個(gè)條件,查詢是否存在記錄,不關(guān)心有多少條記錄。

普遍的 SQL 及代碼寫(xiě)法如下:

  1. ##### SQL寫(xiě)法: 
  2. SELECT count(*) FROM table WHERE a = 1 AND b = 2 
  3.  
  4. ##### Java寫(xiě)法: 
  5. int nums = xxDao.countXxxxByXxx(params); 
  6. if ( nums > 0 ) { 
  7.     //當(dāng)存在時(shí),執(zhí)行這里的代碼 
  8. else { 
  9.     //當(dāng)不存在時(shí),執(zhí)行這里的代碼 

是不是感覺(jué)很 OK,沒(méi)有什么問(wèn)題?

優(yōu)化方案

推薦寫(xiě)法如下:

  1. ##### SQL寫(xiě)法: 
  2. SELECT 1 FROM table WHERE a = 1 AND b = 2 LIMIT 1 
  3. ##### Java寫(xiě)法: 
  4. Integer exist = xxDao.existXxxxByXxx(params); 
  5. if ( exist != NULL ) { 
  6. //當(dāng)存在時(shí),執(zhí)行這里的代碼 
  7. else { 
  8. //當(dāng)不存在時(shí),執(zhí)行這里的代碼 

SQL 不再使用 COUNT,而是改用 LIMIT 1,讓數(shù)據(jù)庫(kù)查詢時(shí)遇到一條就返回,不要再繼續(xù)查找還有多少條了。

業(yè)務(wù)代碼中直接判斷是否非空即可!

根據(jù)查詢條件查出來(lái)的條數(shù)越多,性能提升的越明顯,在某些情況下,還可以減少聯(lián)合索引的創(chuàng)建。

總結(jié)

COUNT() 有兩個(gè)非常不同的作用:

它可以統(tǒng)計(jì)某個(gè)列值的數(shù)量,也可以統(tǒng)計(jì)行數(shù)。在統(tǒng)計(jì)列值時(shí)要求列值是非空的(不統(tǒng)計(jì) NULL)。

如果在 COUNT() 的括號(hào)中定了列或者列表達(dá)式,則統(tǒng)計(jì)的就是這個(gè)表達(dá)式有值的結(jié)果數(shù)。......COUNT() 的另一個(gè)作用是統(tǒng)計(jì)結(jié)果集的行數(shù)。當(dāng) MySQL 確認(rèn)括號(hào)內(nèi)的表達(dá)式值不可能為空時(shí),實(shí)際上就是在統(tǒng)計(jì)行數(shù)。

最簡(jiǎn)單的就是當(dāng)我們使用 COUNT(*) 的時(shí)候,這種情況下通配符 * 并不像我們猜想的那樣擴(kuò)展成所有的列,實(shí)際上,他會(huì)忽略所有列而直接統(tǒng)計(jì)所有的行數(shù)。

——《高性能MySQL》

不管怎樣,我們判斷是否存在。只需確定,有和無(wú),而不是,無(wú)還是有多少!在有的情況下,直接返回,而不需要繼續(xù)統(tǒng)計(jì)行數(shù)!

巧妙的使用 LIMIT 1,獲得更高效率,尤其是在某些復(fù)雜且不規(guī)范的語(yǔ)句中效果更明顯!

作者:程序猿囧途

編輯:陶家龍

出處:toutiao.com/i6826511837840802315

 

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2020-07-28 17:08:43

SQL數(shù)據(jù)庫(kù)

2024-03-14 08:15:18

COUNT(*)數(shù)據(jù)庫(kù)LIMIT 1?

2020-12-04 10:05:00

Pythonprint代碼

2020-12-02 11:18:50

print調(diào)試代碼Python

2021-06-09 06:41:11

OFFSETLIMIT分頁(yè)

2023-10-26 16:33:59

float 布局前段CSS

2021-05-25 09:30:44

kill -9Linux kill -9 pid

2021-01-29 11:05:50

PrintPython代碼

2020-12-15 08:06:45

waitnotifyCondition

2024-12-26 07:47:20

2022-01-27 07:48:37

虛擬項(xiàng)目Django

2020-07-17 07:15:38

數(shù)據(jù)庫(kù)ID代碼

2022-03-10 10:12:04

自動(dòng)化腳本Bash

2024-06-12 13:54:37

編程語(yǔ)言字符串代碼

2019-03-12 14:48:29

路由器XBOXPS4

2022-10-27 21:34:28

數(shù)據(jù)庫(kù)機(jī)器學(xué)習(xí)架構(gòu)

2023-06-26 08:20:02

openapi格式注解

2023-09-08 08:35:42

層疊樣式表CSS

2023-09-14 12:03:30

空指針判空

2020-12-07 06:05:34

apidocyapiknife4j
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)