數(shù)據(jù)庫MySQL查詢優(yōu)化那些事兒
量體裁衣
平時(shí)我們在從數(shù)據(jù)庫獲取數(shù)據(jù)的時(shí)候,非常喜歡使用select *來獲取全部數(shù)據(jù),這樣當(dāng)用戶想要什么數(shù)據(jù)的時(shí)候,都可以獲取到,但是這會(huì)造成數(shù)據(jù)獲取時(shí)間的增大,正確的做法就是需要什么字段,就寫什么字段,這樣才能避免資源的浪費(fèi)。
以小博大
當(dāng)我們想要從兩個(gè)不一樣體量的表中獲取數(shù)據(jù)的時(shí)候,我們應(yīng)該盡量通過小表來進(jìn)行條件判斷,因?yàn)樗男袛?shù)更少,條件判斷查詢更快。
需要注意的是,in 適合將小表放到條件里面,大表放到外面。而 exists 適合將小表放到前面,而大表放到后面,總之,就是最先通過小表進(jìn)行查詢過濾。
一氣呵成
很多人喜歡在循環(huán)里面操作數(shù)據(jù)庫,殊不知這是查詢大忌。我們不應(yīng)該在循環(huán)中進(jìn)行數(shù)據(jù)庫的操作,因?yàn)檫@會(huì)執(zhí)行很多條 sql 語句,我們應(yīng)該將要查詢的數(shù)據(jù)通過循環(huán)進(jìn)行封裝,然后一次性批量地去數(shù)據(jù)庫進(jìn)行查詢,通過一氣呵成來查詢。
恰到好處
在很多時(shí)候,我們查詢數(shù)據(jù)的時(shí)候僅僅需要一條數(shù)據(jù)即可,但是很多時(shí)候我們卻查詢出了很多條數(shù)據(jù)。這些不必要的浪費(fèi)大大增加了數(shù)據(jù)的開銷,因此在查詢的時(shí)候多多使用limit關(guān)鍵字是非常有好處的,它會(huì)大大縮短查詢時(shí)間。
大事化小
當(dāng)數(shù)據(jù)很多的時(shí)候,我們往往通過分頁來解決查詢數(shù)據(jù)的問題,但是當(dāng)總的分頁數(shù)據(jù)過多的時(shí)候,后面查詢的分頁速度會(huì)大大降低,這個(gè)時(shí)候我們可以通過設(shè)置查詢條件來降低每次查詢的條件過濾,將大事化小。
select id,name,des from user limit 1000000,20;
select id,name,des from user where id >1000000 limit 20;
擇善而從
在創(chuàng)建數(shù)據(jù)庫的時(shí)候,我們往往喜歡隨意設(shè)置字段類型,而且喜歡將它設(shè)置得很大,防止以后數(shù)據(jù)的修改。其實(shí),這是大大的錯(cuò)誤,數(shù)據(jù)庫之所以設(shè)計(jì)了不同類型的字段,就是為了讓我們擇善而從,選擇最適合的類型。
如果字段長度基本固定,那么最好使用 char,否則選擇 varchar,如果字段數(shù)據(jù)類型可以用數(shù)字類型,那么就不要使用字符串類型,因?yàn)閿?shù)字類型的效率更高。對于高精度的數(shù)據(jù),我們應(yīng)該怎么使用 decimal 類型。
遐邇一體
很多時(shí)候,我們習(xí)慣通過子查詢來查詢數(shù)據(jù),因?yàn)檫@樣查詢理解更簡單,但是,這種不是一起查詢的話,會(huì)導(dǎo)致查詢效率大大降低,過多的使用子查詢和聯(lián)合查詢,就會(huì)導(dǎo)致增加查詢開銷,占用更多的存儲(chǔ)空間。
一馬當(dāng)先
當(dāng)數(shù)據(jù)庫中的數(shù)據(jù)量非常多的時(shí)候,而一些字段又是我們經(jīng)常需要查找的字段的時(shí)候,我們就需要選出一些關(guān)鍵人物,也就是我們需要設(shè)置索引來加速檢索,通過合理的設(shè)置索引,我們的查詢將會(huì)得到最大程度的優(yōu)化。?