(本文主要講解SQL的優化,不涉及數據庫配置方面的調整,關於數據庫如何配置,等之後有時間再寫,此內容結合工做經驗和網上內容簡要總結,不足之處還請多多指正)sql
1.問什麼須要對SQL進行優化?數據庫
程序上線使用的初期,因爲業務數據量相對較少,一些SQL的執行效率對程序運行效率的影響不太明顯,而開發和運維人員也沒法判斷SQL對程序的運行效率有多大,故不多針對SQL進行專門優化(註釋1)。而隨着時間的積累,業務數據量的增多,SQL的執行效率對程序運行效率的影響逐漸增大,此時對SQL的優化就頗有必要。運維
2.SQL優化的原則分佈式
SQL優化的原則就是盡一切可能提升SQL的執行效率函數
3.SQL優化的方法性能
1)設計數據庫表結構時,要對錶作數量級和性能影響預測和評估,表的字段儘可能都設置default值,儘可能避免default爲null,主要防止在執行SQL查詢時直接將查詢條件設置爲null或者not null而致使數據庫放棄索引,直接全表掃描;測試
2)SQL條件中容許出現庫函數和左模糊查詢,sql條件中庫函數會致使數據庫執行時放棄索引,直接全表掃描,而左模糊也是,直接就全表掃描了;大數據
3)原則上,SQL條件中避免出現<>,in,not in,exists,not exists等操做符;優化
4)子查詢中的實際查詢結果要設置上限要求,且子查詢必需要有索引支持,不然子查詢也去掃描全表就悲劇了;設計
5)單個事務的SQL語句數量要有上限要求,不能前臺一個提交操做,後臺要去插入幾十張表的數據,那若是是千萬級用戶數,基本上就光去插入數據了;
6)同上一條相似,單條SQL語句的數據影響量也要有上限要求,不能一個update操做更新了上千條數據;
7)儘可能減小多表關聯的SQL,若是必須使用多表關聯,也儘可能減小關聯的表數量,且多表關聯時,關聯字段必須包含在查詢索引中。多表關聯SQL中儘可能不要使用視圖和代理表。
8)充分利用索引,嚴禁出現表掃描。同時,建立表時也注意索引的字段順序。
註釋1:通常狀況下,不一樣的行業數據量水平相對而言是比較固定的,好比電信行業的數據主要以用戶數爲基準,按照省級行政單位劃分,數量級在千萬到億級之間。而法院的數據主要以案件數爲基準,按照市級行政單位劃分,數量級在百萬到千萬之間。(這裏只是簡要描述一下,實際數據量比這個大得多啊~)通常狀況下,系統上線前都會針對不一樣行業不一樣地區的數據量作一個估算,而後再經過超大數據量對系統進行性能測試。可是若是遇到技術升級更新或者部署方式發生改變(好比數據集中存放到雲上或者分佈式部署改成大集中部署),那數據量幾乎是十倍百倍的增加,這時候前期SQL執行效率的問題就會暴露出來。
註釋2:發現一個博客,寫SQL優化描述的也比較到位,能夠參考下:http://database.51cto.com/art/201407/445934.htm