數(shù)據(jù)庫(kù)MySQL查詢優(yōu)化那些事兒
量體裁衣
平時(shí)我們?cè)趶臄?shù)據(jù)庫(kù)獲取數(shù)據(jù)的時(shí)候,非常喜歡使用select *來(lái)獲取全部數(shù)據(jù),這樣當(dāng)用戶想要什么數(shù)據(jù)的時(shí)候,都可以獲取到,但是這會(huì)造成數(shù)據(jù)獲取時(shí)間的增大,正確的做法就是需要什么字段,就寫什么字段,這樣才能避免資源的浪費(fèi)。

以小博大
當(dāng)我們想要從兩個(gè)不一樣體量的表中獲取數(shù)據(jù)的時(shí)候,我們應(yīng)該盡量通過(guò)小表來(lái)進(jìn)行條件判斷,因?yàn)樗男袛?shù)更少,條件判斷查詢更快。
需要注意的是,in 適合將小表放到條件里面,大表放到外面。而 exists 適合將小表放到前面,而大表放到后面,總之,就是最先通過(guò)小表進(jìn)行查詢過(guò)濾。
一氣呵成
很多人喜歡在循環(huán)里面操作數(shù)據(jù)庫(kù),殊不知這是查詢大忌。我們不應(yīng)該在循環(huán)中進(jìn)行數(shù)據(jù)庫(kù)的操作,因?yàn)檫@會(huì)執(zhí)行很多條 sql 語(yǔ)句,我們應(yīng)該將要查詢的數(shù)據(jù)通過(guò)循環(huán)進(jìn)行封裝,然后一次性批量地去數(shù)據(jù)庫(kù)進(jìn)行查詢,通過(guò)一氣呵成來(lái)查詢。
恰到好處
在很多時(shí)候,我們查詢數(shù)據(jù)的時(shí)候僅僅需要一條數(shù)據(jù)即可,但是很多時(shí)候我們卻查詢出了很多條數(shù)據(jù)。這些不必要的浪費(fèi)大大增加了數(shù)據(jù)的開(kāi)銷,因此在查詢的時(shí)候多多使用limit關(guān)鍵字是非常有好處的,它會(huì)大大縮短查詢時(shí)間。

大事化小
當(dāng)數(shù)據(jù)很多的時(shí)候,我們往往通過(guò)分頁(yè)來(lái)解決查詢數(shù)據(jù)的問(wèn)題,但是當(dāng)總的分頁(yè)數(shù)據(jù)過(guò)多的時(shí)候,后面查詢的分頁(yè)速度會(huì)大大降低,這個(gè)時(shí)候我們可以通過(guò)設(shè)置查詢條件來(lái)降低每次查詢的條件過(guò)濾,將大事化小。
select id,name,des from user limit 1000000,20;
select id,name,des from user where id >1000000 limit 20;
擇善而從
在創(chuàng)建數(shù)據(jù)庫(kù)的時(shí)候,我們往往喜歡隨意設(shè)置字段類型,而且喜歡將它設(shè)置得很大,防止以后數(shù)據(jù)的修改。其實(shí),這是大大的錯(cuò)誤,數(shù)據(jù)庫(kù)之所以設(shè)計(jì)了不同類型的字段,就是為了讓我們擇善而從,選擇最適合的類型。
如果字段長(zhǎng)度基本固定,那么最好使用 char,否則選擇 varchar,如果字段數(shù)據(jù)類型可以用數(shù)字類型,那么就不要使用字符串類型,因?yàn)閿?shù)字類型的效率更高。對(duì)于高精度的數(shù)據(jù),我們應(yīng)該怎么使用 decimal 類型。
遐邇一體
很多時(shí)候,我們習(xí)慣通過(guò)子查詢來(lái)查詢數(shù)據(jù),因?yàn)檫@樣查詢理解更簡(jiǎn)單,但是,這種不是一起查詢的話,會(huì)導(dǎo)致查詢效率大大降低,過(guò)多的使用子查詢和聯(lián)合查詢,就會(huì)導(dǎo)致增加查詢開(kāi)銷,占用更多的存儲(chǔ)空間。
一馬當(dāng)先
當(dāng)數(shù)據(jù)庫(kù)中的數(shù)據(jù)量非常多的時(shí)候,而一些字段又是我們經(jīng)常需要查找的字段的時(shí)候,我們就需要選出一些關(guān)鍵人物,也就是我們需要設(shè)置索引來(lái)加速檢索,通過(guò)合理的設(shè)置索引,我們的查詢將會(huì)得到最大程度的優(yōu)化。?























