建表:数据库
一、避免将字段设为“容许为空”性能
二、尽可能使用数字型字段,提升查询和链接的性能,减小存储开销。由于引擎在处理查询和链接时会逐个比较字符串中每个字符,而对于数字型而言只须要比较一次就够了。优化
好比,枚举类型尽可能用数值型字段指针
三、尽量的使用 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个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。