總結幾點sql語句優化

一.表設計階段:

   1.主鍵的使用
    a.業務日誌表、安全審計表採用自增長;
    b.自定義編號用於業務流程類表,根據一定的編號規則;
    c.int型主鍵 用於基礎數據表;

   2.邏輯刪除字段的設計

    a.tinyint類型,1或0;

    b.聯合主鍵(如ID+starDate),另加starDate,endDate日期類型字段過濾數據;

  3.儘量避免null值存在,儘可能使用默認值進行填充;

  4.儘量使用varchar/nvarchar 代替 char/nchar;

二.查詢語句注意事項

 百萬級數據庫查詢優化的出發點主要基於儘量避免全表掃描;

    1.衆所周知的像在WHERE ORDER 語句上的字段添加索引;(索引使用上的考慮和權衡,後續還會有總結的博文)

    2.查詢列用列名代替*,COUNT(1)取代COUNT(*);

    3.儘量避免WHERE 子句上和NULL的邏輯判斷,如:WHERE NAME IS NULL;

    4.儘量避免WHERE 子句上使用表達式,如:select goods fromwarehouse where num/2=500 改爲 select goods from warehouse where num=500/2;

    5.儘量避免WHERE 子句上使用內置函數或標量函數;

    6.儘量避免WHERE子句上<>和!=的出現;

    7.儘量避免WHERE子句上OR 連接非索引列;

    8.儘量避免like的使用;

    9.不要在 where 子句中的“=”左邊進行函數、算術運算或其他表達式運算;

    10.對於多張大數據量的表JOIN,要先分頁再JOIN,否則邏輯讀會很高,性能很差。

    11.用 EXISTS代替 IN 是一個好的選擇,如:select [score] from score where name in (select [name] from student)改成 select [score] from score where exists(select 1 from student );

    12.查詢語句通過拼接的Where子句帶有參數的也會導致全表掃描。

     因爲SQL只有在運行時纔會解析局部變量,但優化程序不能將訪問計劃的選擇推遲到運行時;它必須在編譯時進行選擇。然而,如果在編譯時建立訪問計劃,變量的值還是未知的,因而無法作爲索引選擇的輸入項。

     解決的方法是可以改爲強制查詢使用索引:select [address] from student where name=@name 改爲 select [address] from student with(index('indexname'))where name=@name;

    13.索引並不是越多越好,一張表上最多不超過6個,後續我會針對索引的使用進行詳細的總結;

    14.能用數值的字段儘量不用字符;

以上內容爲本人近期項目中總結以及參考網上賢人志士的文章進行梳理總結,以便增強個人在sql使用上的技巧性;

不足之處還請糾正補充!

引用連接:http://database.51cto.com/art/201407/445934.htm

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章