系统性能调优(3)----数据库索引优化

系统 1684 0

索引是对数据库表中一列或多列的值进行排序的一种结构,使用索引可快速访问数据库表中的特定信息。其实道理很简单,比如我们要从字典中查找一个字,那么这个字典就是我们所要面对的数据库,索引就好比是字典前面的拼音或者部首索引表,当需要查询一个字的时候我们首先去检索拼音或者部首索引表,然后再去字典中查找具体的位置,这样我们就加快数据库的查询速度。

索引分为聚簇索引和非聚簇索引两种,聚簇索引是按照数据存放的物理位置为顺序的,而非聚簇索引就不一样了(下一篇文章将介绍常见的索引)。显而易见的字典本身的内容以及前面的拼音检索表就是聚簇索引,因为他们都是按照 26 个字母的顺序排列的。而后面的部首检索表就是一个非聚簇索引,他并不是按照每个字所在的具体的位置排列的,而是通过特定的排列规则进行排序的。

使用索引的好处就是查询起来效率高了,但任何事物都有正反两方面,使用索引也会降低数据库的效率,这里的效率是指在增删改的时候会比不讲索引效率慢。道理很简单如果一本字典随时在变化那么需要变的不仅仅是这个字典的内容还有就是这个字典前面的拼音或者部首检字表。所以有索引的情况下增删改的效率肯定会降低的。

而且需要注意的是有索引不一定效率就会提升,试想一本字典可以把所有的字全部放在检索表中(实际上这是没有意义的)这样的话如果要查询一个字那么就相当于查询了多次,首先在庞大的检索表中查询一遍,然后再去数据库中查询这个字的详细内容,这要比直接从字典查询效率要低。

建立索引不一定就提高查询的效率,这取决于索引是否合理,以及查询是否用到索引。并非是在任何字段上简单地建立索引就能提高查询速度。索引的建立,会带来更多的系统开销,因为系统要耗费资源去维护它,如果建立了没有用到的索引,不适当的索引,过多的索引,反而会导致查询性能下降。总之索引的建立,要看表的结构,数据的分布,还有你要用到哪些数据,如果把索引建立在你根本不需要的数据列上,是根本不会发挥作用的举例如下:

1 )全表扫描

只在主键上建立聚集索引:

Selectid,name,dept,emdate from person    用时: 20546 毫秒(即: 21 秒)

不在主键上建立聚集索引,只建普通索引

Selectid,name,dept,emdate from person     用时: 17923 毫秒(即: 18 秒)

以上查询执行的实际上索引不会发挥作用,因为提取的是全部数据。聚集索引在这里会耗费更多的资源,所以会看到,不建立聚集索引比建立聚集索引还要快

(2): 按日期进行过滤 ( 用到索引 )

在主键上建立聚集索引,在 emdate 上建立非聚集索引:

Select id,name,dept,emdatefrom person where     emdate>dateadd(day,+1,getdate()) 用时: 12376 毫秒( 12 秒)

在主键上建立聚集索引,在 emdate 上没有索引:

selectid,name,dept,emdate from person where emdate>dateadd(day,+1,getdate()) 用时: 21296 毫秒( 21 秒)

在主键上建立非聚集索引,在 emdate 上建立非聚集索引:

selectid,name,dept,emdate from person where emdate>dateadd(day,+1,getdate()) 用时: 11590 毫秒( 12 秒)

在主键上建立非聚集索引,在 emdate 上建立聚集索引:

selectid,name,dept,emdate from person where emdate>dateadd(day,+1,getdate()) andemdate<dateadd(day,+3,getdate())   用时: 5233 毫秒( 5 秒)

虽然每条语句提取出来的都是 30 万条数据,各种情况的差异却是比较大的,特别是将聚集索引建立在日期列时的差异。事实上,如果您的数据库真的有几千万条记录的话,差距会更明显。

关于索引方面的系统优化和其他优化一样,都需要根据实际的情况而定,了解了索引的原理那么就能对症下药,合理的建立索引进而提高系统的查询效率。

系统性能调优(3)----数据库索引优化


更多文章、技术交流、商务合作、联系博主

微信扫码或搜索:z360901061

微信扫一扫加我为好友

QQ号联系: 360901061

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描下面二维码支持博主2元、5元、10元、20元等您想捐的金额吧,狠狠点击下面给点支持吧,站长非常感激您!手机微信长按不能支付解决办法:请将微信支付二维码保存到相册,切换到微信,然后点击微信右上角扫一扫功能,选择支付二维码完成支付。

【本文对您有帮助就好】

您的支持是博主写作最大的动力,如果您喜欢我的文章,感觉我的文章对您有帮助,请用微信扫描上面二维码支持博主2元、5元、10元、自定义金额等您想捐的金额吧,站长会非常 感谢您的哦!!!

发表我的评论
最新评论 总共0条评论