好程序員大數據解析 SQL優化方案精解十則

  好程序員大數據解析 SQL優化方案精解十則SQL優化是對數據庫操做效率提升的重要課題,所以先直入正題,與你們分享幾個經常使用的,但容易忽視的幾個SQL優化方案以下:
1、避免進行null判斷
    應儘可能避免在 where 子句中對字段進行 null 值判斷,不然將致使引擎放棄使用索引而進行全表掃描,這裏最好不要給數據庫留NULL,儘量的使用 NOT NULL填充數據庫。
備註、描述、評論之類的能夠設置爲 NULL,最好不要使用NULL。不要錯誤的認爲NULL 不須要空間,如char(100) 型,在字段創建時,空間就固定了。不論是否插入值(NULL也包含在內),都是佔用 100個字符的空間的,若是是varchar這樣的變長字段, null 不佔用空間。能夠在num上設置默認值0,確保表中num列沒有null值。
2、不要使用select *
    使用select *的話會增長解析的時間,另外也會把不須要的數據同時查詢出來,從而延長數據傳輸時間,耗費精力。如text類型的字段,一般用來保存一些內容比較繁雜的東西,若是使用select *則會把該字段也查詢出來。
3、謹慎使用模糊查詢
    當模糊匹配以%開頭時,該列索引將失效。若不以%開頭,該列索引有效。
4、不要使用列號
    使用列號的話,將會增長沒必要要的解析時間。
5、優先使用UNION ALL,避免使用UNION
    由於UNION 會將各查詢子集的記錄作比較,故比起UNION ALL ,一般速度都會慢上許多。通常來講,若是使用UNION ALL能知足要求的話,務必使用UNION ALL。還有一種狀況,若是業務上可以確保不會出現重複記錄。
6、在where語句或者order by語句中避免對索引字段進行計算操做
    當在索引列上進行操做以後,索引將會失效。正確作法應該是將值計算好再傳入進來。
7、使用not exist代替not in
    若是查詢語句使用了not in 那麼內外表都進行全表掃描,沒有用到索引;而not extsts 的子查詢依然能用到表上的索引。
8、exist和in的區別
    in 是把外表和內表做hash 鏈接,而exists是對外表做loop循環,每次loop循環
再對內表進行查詢。所以,in用到的是外表的索引, exists用到的是內表的索引。若是查詢的兩個表大小至關,那麼用in和exists差異不大。若是兩個表中一個較小,一個是大表,則子查詢表大的用exists,子查詢表小的用in。
9、避免在索引列上作以下操做
    1.避免在索引列上使用IS NULL和IS NOT NULL。
    2.避免在索引列上出現數據類型轉換。(好比某字段是String類型,參數傳入時是int類型)當在索引列上使用如上操做時,索引將會失效,形成全表掃描。
10、複雜操做能夠考慮適當拆成幾步
    有時候會有經過一個SQL語句來實現複雜業務的例子出現,爲了實現複雜的業務,嵌套多級子查詢。形成SQL性能問題。對於這種狀況能夠考慮拆分SQL,經過多個SQL語句實現,或者把部分程序能完成的工做交給程序完成。程序員

相關文章
相關標籤/搜索