欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

数据库索引、优化

程序员文章站 2022-05-03 14:54:34
参考地址: 如何看MS SQLSERVER数据库的执行计划https://blog.csdn.net/luoyanqing119/article/details/17022649 SQLserver索引的原理和应用https://www.cnblogs.com/knowledgesea/p/3672 ......

参考地址:

如何看ms sqlserver数据库的执行计划https://blog.csdn.net/luoyanqing119/article/details/17022649     

 

sqlserver索引的原理和应用

聚集索引和非聚集索引

数据库sql优化大总结之 百万级数据库优化方案

数据库优化之程序操作优化https://www.cnblogs.com/ak2012/archive/2012/12/28/2012-122803.html

数据库索引、优化

 

 上图中,数据库执行一个t-sql发生的事,了解一下数据库的构成以及功能。

执行计划:

  可以缓存,存储过程/参数化查询

  select * from user where id=1

  select * from user where id=2

  select * from user where id=@id

数据是什么?

  数据库就是把东西有序放好,还能随时找到的一个工具。应用程序,有序的数据管理,数据在硬盘上(持久化,唯一的,多线程操作需要加锁,速度慢,可以ssd加快速度)。char nvarchar字段最长是8kb。

聚集索引

  举个例子,在图书馆中,就是书多。图书馆是怎么分类的呢?文学、武侠、it.....每个类别还有很多书啊,就按照首字母排序。新华字典文字都是按照字母排序的。聚集索引也叫聚簇索引,把数据有序的拜访,物理排序,找字母a开头,找时间范围的。。。

  sqlserver自增int,默认聚集索引,所以查询不排序,就是id排序。换聚集索引很耗时,很多的硬盘操作,生产环境需要谨慎。聚集索引只有一个,但是生成聚集索引的可以有多个列。一般是自增主键/创建时间/价格。因为数据物理排序了,所以查询快,非常适合大于、小于、between order by。

  聚集索引速度大于非聚集索引

非聚集索引

  在新华字典中,偏旁部首查找汉子---找页码----看详情。图书馆电子查找,输入名字---楼层----书架---层。

  特点:重复存储值和路径,体积小一些,所以查找快一些,快速定位,直达目标。不影响数据的物理排序,但是会重复存储一个数据和位置。

  找数据:先找索引----快速定位-----拿到数据,查找快,但是有维护的索引的成本,请小心。

  非聚集索引可以有很多个,好像最多个255个,每个索引也可以有很多个字段,建议索引不要超过10个。适合经常查询的字段。非聚集索引不能运算,不能like'% %',也不能where id-1>10。like 'a%'这个是可以用非聚集索引的。

建议索引的原则/建议:

  1、主键是必须建立索引的(推荐数值主键,性能最高)

  2、外键也要索引,join能提升性能

  3、经常查询的字段建立索引

  4、经常在where里面的也要建立索引

  5、order by 、group by、distinct

  6、聚合运算/where条件时,先索引字段

不需要建立索引的:

  1、基本不怎么查询的

  2、重复值比较伛的

  3、text/image不要索引

  4、索引不要太多了

还有其他的索引,主xml索引、辅助xml索引、空间索引、非聚集columnstore索引(数量超过千万的时间建立的索引,先出的一个东西吧)

数据库索引、优化

 

   执行计划:

    提交sql语句,数据库查询优化器,经过分析生成,指定多个查询方式,从中算则使用资源最少的,数控制定执行计划是按照使用资源最少,而不是时间最短。

    1、table scan 全表扫描性能最差
    2、cluster index scan (聚集索引的扫描) 性能最差,同上,虽然有聚集索引,其实也是全表扫描
    3、index seek(nonclustered)(索引查找) 性能非常高
    4、index scan 先index 再扫描
    5、cluster index seek 性能最高

常规的sql优化建议

  1、对列的计算,任何形式都要避免

  2、in 查询 or 查询索引会失效,可能是拆分

  3、in 换 exists,not in 不要用,完全不走索引

  4、is null 和 is not null都不走索引,索引里面不保存null的

  5、<>这种也不走索引,可以拆分成< 和 >

  6、join时,连接越少,性能越高。左连接,以左边的表结果为主;右连接,反过来;连接字段要求带做引

 

当数据库梁达到上亿之后,索引用处就不大了,sqlserver数据库,两千万就可以了。当数据量过大,就应该从数据库设计层次找问题了。