數據庫的優化

數據庫機構的設計(選取最適用的字段屬性):

  1. 能使用小字段類型,就儘量用小字段類型;如能用short,就不要用int;能使用數字類,就不要用字符串類型。
  2. 儘量把字段設置爲NOTNULL,這樣將在未來執行查詢的時候,數據庫不用去比較NULL值。
  3. char和varchar的使用:char是不可變字符類型,varchar是可變字符類型 。如果字符串的長度不確定的情況下–char查詢快,但消耗內存空間。varchar查詢慢,但節省空間。字段長度變化不大的情況下選擇char,變化大的情況下選擇varchar。
  4. 字段的長度在最大限度的滿足可能需要的前提下,應該儘可能的設得短一些,這樣就可以提高查詢效率,而且在建立索引的時候也可以減少 資源的消耗。

查詢優化:

保證在實現功能的基礎上,儘量減少對數據庫的訪問次數;最小化結果集,從而減網絡負擔。

  • 使用join來代替子查詢:子查詢可以一次性的完成很多邏輯上需要多個步驟才能完成的SQL操作,同時也可以避免事務或者表鎖,寫起來也很容易。但是有些情況下JOIN將會使查詢速度變得很快。因爲在MySQL中使用JOIN將不需要在內存中創建臨時表來完成邏輯上的查詢工作。
  • 使用索引查詢應注意:

    1.應儘量避免在where字句中對字段進行null值的判斷,否則將會導致引擎放棄使用索引而進行全表掃描。
    例:select id from table where num is null
    可以給num的默認值賦值爲0,確保num列中沒有 null值,然後進行查詢。
    例:select id from table where num = 0
    2.儘量避免 where 子句中使用 !=或< > 操作符,都則會使引擎放棄使用索引而進行全表掃描。優化器將無法通過索引來確定將要命中的行數,因此需要搜索該表的所有行
    3.儘量避免在 where 子句中使用 or 來連接條件,否則將會導致引擎放棄使用索引而進行全表掃描。
    例:select id from table where num = 10 or num = 20
    使用or將會進行全表掃描,使用union進行連接。
    例:select id from table where num = 10 union all select id from table where num = 20
    4.in 和 not in的使用,因爲in會使用系統無法使用索引,而只能直接搜索表中的數據。
    例:select id from table where num in(1,2,3)
    對於連續的數值,能用between就不要使用in了
    例:select id from table where num between 1 and 3
    5.儘量避免在索引過的字符串數據中,使用非打頭字母搜索。這使得引擎無法利用索引。
    例:select * from table where name like '%L%'索引將會失效。
    應使用打頭字母進行搜索,索引將不會失效:
    例:select *from table where name like ''L%
    6.應儘量避免where子句中對字段進行表達式操作,將會導致引擎放棄使用索引而進行全表掃描。
    例:select *from table where F1/2 =100應改爲
    select *from table where F1 = 100*2
    7.應儘量避免在where子句中對字段進行函數操作,這將導致索引失效。任何對列的操作都將會導致表掃描,它包括數據庫函數,計算表達式等等,查詢時應儘可能的將操作移到“=”的右邊。
    8.在使用索引字段作爲條件時,如果該索引爲複合索引,那麼必須使用到改索引中的第一個字段做爲條件時才能保證系統使用到該索引(最左前綴索引),並且儘可能的讓字段順序與索引順序相一致。
    9.充分利用連接條件,在某種情況下,兩個表之間可能不只一個連接條件,這時我咋where子句中將連接條件完整的寫上,有可能大大提高查詢速度。
    10.臨時表的使用,當需要重複引用大型表或常用表中的某個數據集時可以考慮建立臨時表。如果使用了臨時表,在存儲過程的最後一定將所有的臨時表進行刪除,這樣可以避免系統表的較長時間鎖定。

事務

僅管很多處理都可以通過使用子查詢,鏈接,聯合進行操作,但是更多的時候是需要用到一系列的語句來完成某種工作。但是當這個語句塊中的某一條語句運行出錯的時候,整個語句塊的操作就會變得不確定起來。要避免這種情況的發生,就應該使用事務,他的作用是:要麼語句塊中的每一條語句都操作成功,要麼都失敗。事務以BEGIN關鍵字開始,COMMIT關鍵字節數。在這之間的一條sql操作失敗,那麼,ROLLBACK命令就可以把數據庫恢復到BEGIN開始之前的狀態。

鎖定表

僅管事務是維護數據庫完整性的一個非常好的方法,但卻因爲他的獨立性,有時會影響數據庫的性能,尤其是在很大的應用系統中。由於在事務執行的過程中,數據庫將會被鎖定,因此其它的用戶請求只能暫時等待直到事務結束。如果訪問量小點的話影響也一般,但是用戶數量增大時將會造成等待時間變長。 系統利用鎖,保證數據的完整性。

建立合適的索引

創建索引一般有兩個目的:維護被索引列的唯一性和提供款速訪問表中數據的策略。
大型數據庫有兩種索引聚簇索引和非聚簇索引。非聚簇索引的表是按堆結構存儲數據,所有的數據均添加在表的尾部,而聚簇索引的數據在物理上會按照簇索引鍵的順序存儲,一個表只允許有一個簇索引,數據與索引是放到一塊的,找到索引也就找到了數據。
使用聚簇索引和非聚簇索引的場合:

動作 聚簇索引 非聚簇索引
列經常被分組排序
返回某範圍內的數據
小數目的不同值
大數目的不同值
頻繁更新列
頻繁修改索引列

我們可以通過前面聚集索引和非聚集索引的定義理解上表。如:返回某範圍內的數據一項。比如表中有一個時間列,恰好把聚合索引建立在了該列,這時查詢某一時間段的全部數據時,查詢速度很快因爲這本字典正文是按時間排序的,聚簇索引只需要找到要檢索的所有數據中開頭和結尾的數據即可;而不像非聚集索引,必須先找到目錄中查到每一項數據對應的頁碼,然而再根據頁碼查到具體內容。

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