SQLServer索引

最近遇到网站访问速度很慢,两方面的原因:1、服务器硬件不给力,CPU和内存配置太低;2、SQL语句有待优化。

谈到SQL优化,建立合适的索引是优化的主要方面。下面是我对SQLServe索引的一点理解,刚接触这东西,难免有错,和大家一起学习了。

SQLServer表中可以建索引,也可以不建,索引分为两类:聚集索引和非聚集索引。

索引的目的:加快查询的速度,当然它也随之有负面影响,就是增、改、删数据时还是维护索引表,降低了速度。不过,一般来说,查询要远多于增、改、删,所以建索引还是值得的。

索引的本质:无论是哪种索引,其本质是一样的,简单的说,就是对某个或某些字段排序后得到的表——有序表(数据结构中会讲索引)。具体的:索引是对表中的某个或某几个字段排序后得到的一张表,这张表就是索引表,当按这些排过序的字段查询时,就可以用针对有序序列的算法如二分法等查询,速度自然快很多。索引表的每条记录对应一个指针,指向原表的记录,这样通过索引表的一条记录就能找到原表对应的记录(对于聚集索引,它并没有建单独的索引表,是直接对原表的排序)。这样一看,其实索引是很简单的东西。举例:select * from T_LEARNER where username = ‘[email protected]’。如果username是索引,那查询时就先查询索引表,然后通过对应的地址指针找到原表的记录,并取出。而如果该字段不是索引,那就的查询原表,由于username是无序的,就是对所有username进行查询了。

聚集索引:聚集索引是按索引字段对原表做排序操作,是直接对原表的修改,并没有建单独的索引表。当表中没有聚集索引时,表中所有的字段都是无序排列的,当建聚集索引时,会立即在原表中按聚集索引的字段排序。聚集索引的优势很明显,由于索引表就是原表排序后得到的,所以从索引表查到记录就可以了,不用像单独的索引表那样再通过指针定位到原表取数据,所以查询速度更快。一张表的聚集索引只能有一个,不过聚集索引可以是一个或多个字段。

非聚集索引:非聚集索引不是对原表的直接修改,而是先建立原表的一个副本(一般情况下,并不是原表的完整的副本,而只是包含索引字段,如果需要,才会包含原表的其它字段),然后对该副本按索引字段进行排序。非聚集索引也可以是一个或多个字段,可以用include语句包含非索引的字段,即把一些非索引字段加入到索引表中,对这些字段并不排序。加入非索引字段的目的是为了当从索引表查询到匹配的记录后,不用再反查原表了,因为索引表中已经包含要取的字段了。

聚集索引和非聚集索引的区别:索引的本质就是有序表,聚集索引和非聚集索引都是有序表。两者的区别是聚集索引是直接对原表排序,而非聚集索引是对原表副本排序,但通常该副本并不是原表的完整副本,它只包含少数几个字段,而且每条记录还有指针指向原表的记录。这两个集合有交集,当非聚集索引通过include语句包含原表的的所有字段时,索引表就成了原表的一个完整副本,还有指向原表的指针,这时的索引其实就是副本上的聚集索引了。不同的副本可以建不同的聚集索引,这样可以加快查询的速度。当然,这样做的代价就是增加了磁盘消耗,当加载表到内存时,多个表的副本还会增加内存消耗,所以一般情况下不会这样做。我这里并没有从聚集还是非聚集的角度来区分两者,是因为从那个角度区分没啥意义,而从上面的角度区分有助于更直观的理解两者。

你可能感兴趣的:(sqlserver)