數據庫建表和索引的建議

建表:數據庫

一、避免將字段設爲「容許爲空」性能

二、儘可能使用數字型字段,提升查詢和鏈接的性能,減小存儲開銷。由於引擎在處理查詢和鏈接時會逐個比較字符串中每個字符,而對於數字型而言只須要比較一次就夠了。優化

好比,枚舉類型儘可能用數值型字段指針

三、儘量的使用 varchar/nvarchar 代替 char/nchar ,由於首先變長字段存儲空間小,能夠節省存儲空間,其次對於查詢來講,在一個相對較小的字段內搜索效率顯然要高些。排序

四、儘可能不要使用TEXT數據類型索引

建索引:資源

一、正確的選擇數據類型字符串

Int,bigint, smallint,和tinyint等這些數據類型都很是適合於用在索引中,由於他們都佔用相同大小的空間而且能夠很容易地實現比較操做。其餘的數據類型如char和varchar的效率都很是低,由於這些數據類型都不適合於執行數學操做,而且執行比較操做的時間都比上面提到數據類型要長。數學

二、建立多列索引時,須要注意列的順序效率

數據庫將根據第一列索引的值來排列記錄,而後進一步根據第二列的值來排序,依次排序直到最後一個索引排序完畢。哪一列惟一數據值較少,哪一列就應該爲第一個索引,這樣能夠確保數據能夠經過索引進一步交叉排序。

三、在clustered(彙集)索引中限制列的數量

在clustered索引中用到的列越多,在nonclustered索引中包含的clustered索引參考位置就越多,須要存儲的數據也就越多。這樣將增長包含索引的數據表的大小,而且將增長基於索引的搜索時間。

四、避免頻繁更新clustered索引數據列

clustered 索引數據列的順序就是表記錄的物理存儲順序,一旦該列值改變將致使整個表記錄的順序的調整,會耗費至關大的資源。

nonclustered 索引依賴於clustered 索引,因此若是構成clustered 索引的數據列頻繁更新,將致使在nonclustered中存儲的行定位器也將隨之頻繁更新。對於全部與這些列相關的查詢來講,若是發生記錄被鎖定的狀況時,這將可能致使性能成本的增長。

若應用系統須要頻繁更新 clustered 索引數據列,那麼須要考慮是否應將該索引建爲 clustered 索引。

五、分開操做(若是可能的話)

對於一個表來講,若是須要進行頻繁的執行插入、更新操做,同時還有大量讀操做的話,在可能的狀況下嘗試將這個表分開操做。全部的插入和更新操做能夠在一個沒有索引的表中操做,而後將其複製到另一個表中,在這個表裏有大量的索引能夠優化讀數據的能力。

六、適當的重建索引

Nonclustered索引包含clustered索引的指針,這樣一來Nonclustered索引將從屬於clustered 索引。當重建clustered索引時,首先是丟棄原來的索引,而後再使用CREATE INDEX 來建立索引,或者在使用CREATE INDEX 聲明的同時將DROP_EXISTING 子句做爲重建索引的一部分。將丟棄和建立分爲幾步將會致使屢次重建nonclustered 索引,而不象使用DROP_EXISTING 子句那樣,只重建一次nonclustered 索引。

七、索引有大量數據重複,SQL查詢可能不會利用索引,如字段sex,male和female幾乎各一半,建了索引也沒有用。

八、索引並非越多越好,索引當然能夠提升相應的 select 的效率,但同時也下降了 insert 及 update 的效率,由於 insert 或 update 時有可能會重建索引,因此怎樣建索引須要慎重考慮,視具體狀況而定。一個表的索引數最好不要超過6個,若太多則應考慮一些不常使用到的列上建的索引是否有必要。

相關文章
相關標籤/搜索