sqlserver优化

 说到数据库优化,大家第一反应就是建索引! 那么有时候,我们建立索引,查询的速度并没有提升,反而插入、更新,删除的操作反而变慢了。很多同学都好奇,我明明建立索引,却没有效果? 索引确实建立了,但是似乎没啥效果! 这个时候我们就要看看,我们建立的索引。 小王 在student(id,sno,name,age,grade)表 中插入了100万条数据,这个时候不做任何处理,去查询很慢,于是乎就以id为主键,默认建立聚集索引,小王认为我的表建立的索引,我现在查询速度应该会快一些,但是实际小王发现并没和想象中一样,查询的速度并没有很大的提升。小王狠不解,表示十分疑惑,我明明有索引,为啥速度没啥变化。 这个时候我看了下小王的sql是这样的: select *  from student where name like '%王%';  小王想查询名字带王的学生信息,看到这里,了解过索引的同学应该知道为什么,速度没有提升了?

 针对这个问题,我说说我的想法和感受:

 1、小王对索引的认识只是停留在表面,可能没有实际用过索引,我相信很多开发同学也一样,知道这玩意,但是没有深入了解学习;

 2、索引是什么?索引是干嘛用的?索引怎么建立?(这里不是说语法)

3、针对 小王的查询的需求,我们怎么去优化?

 索引是什么? 很多人都认为是一个目录,就想字典/书籍的目录,为了方便我们去查找。这个确实是索引的一个身份,还有一个身份索引也是一种数据结构,数据库内的数据结构。

索引干嘛的? 加速查询,避免全表扫描。 索引分聚集索引,非聚集索引。聚集索引一个表只能有一个,非聚集索引可以有多个。为啥聚集索引只能有一个? 因为表的默认排序只能有一种方式,要不根据id,要不根据时间,不可能两种方式同事使用,聚集索引决定了表的排序方式。通常主键默认建立了聚集索引。

索引怎么建立? 这边我不想说语法,网上有太多语法介绍,不会的可以去找找,建立索引要注意什么? 当我们要建立索引,我们要想,我们在哪个字段?id?,sno?,name?,age?,grade? 是看心情,还是随便选择几个? 其实是需要看我们的需求,如果我们查询经常用sno作为筛选条件,我们就在sno上建立索引,如果我们用grade作为筛选条件,那么就在grade上建立,那么有同学会想,那我要是建表的时候不确定哪个作为条件怎么办?能不能全部字段都建立索引?  这样我的建议是最好不要,一张表的索引过多了也不好,一般不要超过六个。我们建立索引是要在经常作为查询筛选条件的字段,小王就是以name为查询条件,索引建在id上,这样还是会全表扫描。

至于优化,我想看完前面的内容,大家都能想到在name字段上建立一个索引,能够提升小王的查询速度。其实不然,即使建立了索引,还是不会提升速度。为什么了? 这是我想和大家分享的一个知识点,因为查询并没有用到索引,也就是索引是失效的。 为什么索引失效了?怎么处理索引就不会失效了?还有那些情况会导致索引失效了?

1、为啥会失效? 因为 like‘%’ 是匹配所有,即使有索引,也是全表扫描,索引根本没有发挥实力,当我们改成这样 select *  from student where name like '王%'; 这样查询速度快了,索引也起作用了,可这样我们需求就不对了。需求不对,后面我们在给出一个方案,我们接着看失效的问题,还有什么会导致失效了? 

a.  where  name =‘a’  or name ='b';  or 会导致失效

b. where  name+'-'='a-'; 对索引字段进行操作也会导致失效,包括函数操作 substring(name)等

c. 对表的频繁插入和删除

d. where 子句中使用 != 或 <> 操作符;

e.where name is null ;

f. where name in/not in ();

g.like '%%'

h.where name = @num --@num 是参数;

针对上面失效我们如何避免:

a-1: 用union all 来取代or

b-1:不要对索引字段进行处理,需要处理的话,可以在查询到数据之后,或者处理条件值

c-1:频繁插入和删除,建议定期重组索引

d-1:不要使用!=和<>,用 其他条件去替代

e-1:推荐用num类型字段 默认可为0

f-1: 用exists 和between 来替代

g-1:用全文检索(解决上文需求问题)

h-1:这种完全可以避免,程序中尽量不要出现这种情况

 

 

避免了索引失效,那么还有没有其他的方法了? 能进一步优化?

1、select  * 这个 我相信大家都知道不好,但是都爱用,但是需要优化速度,这个确实是个入手点。我们需要确定需要查询那些字段?如果不是全部字段都要,只要三四个字段的话,我们还可以建立一个覆盖索引,这样能够进一步提升速度。

2、全文索引替代like 全文索引的性能远好于like;

 

以上我的一点愚见,希望有什么错误的地方,大家批评交流。

 

posted @ 2021-11-03 17:06  韩泽瑞  阅读(172)  评论(0)    收藏  举报