或許你不知道的10條SQL技巧

本文摘抄自沈劍老師的文章,原文地址:https://mp.weixin.qq.com/s/dGcgts4NNTmVQNRT-j2MZw

一款筑、一些常見的SQL實(shí)踐

(1)負(fù)向條件查詢不能使用索引

select * from order where status!=0 and stauts!=1

not in/not exists都不是好習(xí)慣

可以優(yōu)化為in查詢:

select * from order where status?in(2,3)


(2)前導(dǎo)模糊查詢不能使用索引

select * from order where desc like?'%XX'

而非前導(dǎo)模糊查詢則可以:

select * from order where desc like?'XX%'


(3)數(shù)據(jù)區(qū)分度不大的字段不宜使用索引

select * from user where?sex=1

原因:性別只有男智蝠,女,每次過濾掉的數(shù)據(jù)很少奈梳,不宜使用索引杈湾。

經(jīng)驗(yàn)上,能過濾80%數(shù)據(jù)時(shí)就可以使用索引攘须。對于訂單狀態(tài)漆撞,如果狀態(tài)值很少,不宜使用索引于宙,如果狀態(tài)值很多浮驳,能夠過濾大量數(shù)據(jù),則應(yīng)該建立索引捞魁。


(4)在屬性上進(jìn)行計(jì)算不能命中索引

select * from order where?YEAR(date)?< =?'2017'

即使date上建立了索引至会,也會(huì)全表掃描,可優(yōu)化為值計(jì)算:

select * from order where date < = CURDATE()

或者:

select * from order where date < = '2017-01-01'


二谱俭、并非周知的SQL實(shí)踐

(5)如果業(yè)務(wù)大部分是單條查詢奉件,使用Hash索引性能更好宵蛀,例如用戶中心

select * from user where uid=?

select * from user where login_name=?

原因:

B-Tree索引的時(shí)間復(fù)雜度是O(log(n))

Hash索引的時(shí)間復(fù)雜度是O(1)


(6)允許為null的列,查詢有潛在大坑

單列索引不存null值县貌,復(fù)合索引不存全為null的值术陶,如果列允許為null,可能會(huì)得到“不符合預(yù)期”的結(jié)果集

select * from user where name?!=?'shenjian'

如果name允許為null煤痕,索引不存儲(chǔ)null值梧宫,結(jié)果集中不會(huì)包含這些記錄。

所以杭攻,請使用not null約束以及默認(rèn)值祟敛。


(7)復(fù)合索引最左前綴,并不是值SQL語句的where順序要和復(fù)合索引一致

用戶中心建立了(login_name, passwd)的復(fù)合索引

select * from user where?login_name=? and passwd=?

select * from user where?passwd=? and login_name=?

都能夠命中索引


select * from user where login_name=?

也能命中索引兆解,滿足復(fù)合索引最左前綴


select * from user where passwd=?

不能命中索引馆铁,不滿足復(fù)合索引最左前綴


(8)使用ENUM而不是字符串

ENUM保存的是TINYINT,別在枚舉中搞一些“中國”“北京”“技術(shù)部”這樣的字符串锅睛,字符串空間又大埠巨,效率又低。


三现拒、小眾但有用的SQL實(shí)踐

(9)如果明確知道只有一條結(jié)果返回辣垒,limit 1能夠提高效率

select * from user where login_name=?

可以優(yōu)化為:

select * from user where login_name=? limit 1

原因:

你知道只有一條結(jié)果,但數(shù)據(jù)庫并不知道印蔬,明確告訴它勋桶,讓它主動(dòng)停止游標(biāo)移動(dòng)


(10)把計(jì)算放到業(yè)務(wù)層而不是數(shù)據(jù)庫層,除了節(jié)省數(shù)據(jù)的CPU侥猬,還有意想不到的查詢緩存優(yōu)化效果

select * from order where date < = CURDATE()

這不是一個(gè)好的SQL實(shí)踐例驹,應(yīng)該優(yōu)化為:

$curDate = date('Y-m-d');

$res = mysql_query(

??? 'select * from order where date < = $curDate');

原因:

釋放了數(shù)據(jù)庫的CPU

多次調(diào)用,傳入的SQL相同退唠,才可以利用查詢緩存


(11)強(qiáng)制類型轉(zhuǎn)換會(huì)全表掃描

select * from user where phone=13800001234

你以為會(huì)命中phone索引么鹃锈?大錯(cuò)特錯(cuò)了,這個(gè)語句究竟要怎么改瞧预?


末了倔叼,再加一條胀糜,不要使用select *(潛臺(tái)詞魁淳,文章的SQL都不合格 =_=)琅催,只返回需要的列,能夠大大的節(jié)省數(shù)據(jù)傳輸量秸苗,與數(shù)據(jù)庫的內(nèi)存使用量喲召娜。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市惊楼,隨后出現(xiàn)的幾起案子玖瘸,更是在濱河造成了極大的恐慌秸讹,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件雅倒,死亡現(xiàn)場離奇詭異璃诀,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蔑匣,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進(jìn)店門劣欢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人裁良,你說我怎么就攤上這事凿将。” “怎么了价脾?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵牧抵,是天一觀的道長。 經(jīng)常有香客問我侨把,道長犀变,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任秋柄,我火速辦了婚禮获枝,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骇笔。我一直安慰自己省店,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布笨触。 她就那樣靜靜地躺著萨西,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旭旭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天葱跋,我揣著相機(jī)與錄音持寄,去河邊找鬼。 笑死娱俺,一個(gè)胖子當(dāng)著我的面吹牛稍味,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播荠卷,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼模庐,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了油宜?” 一聲冷哼從身側(cè)響起掂碱,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤怜姿,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后疼燥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沧卢,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年醉者,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了但狭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,163評論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡撬即,死狀恐怖立磁,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情剥槐,我是刑警寧澤唱歧,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站才沧,受9級特大地震影響迈喉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜温圆,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一挨摸、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧岁歉,春花似錦得运、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至非剃,卻和暖如春置逻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背备绽。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工券坞, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人肺素。 一個(gè)月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓恨锚,卻偏偏與公主長得像,于是被迫代替她去往敵國和親倍靡。 傳聞我的和親對象是個(gè)殘疾皇子猴伶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,925評論 2 344

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