数据库查询、索引性能优化的一些整理
数据库优化的目标
通过一些列的手段,使系统能够协调、平衡的运作,合理的相应外部请求,实现利用资源最大化。说白了就是优化后可能不是最快的,但一定是最稳定的,要保证系统能够稳定的运行而不是隔三岔五CPU就爆了。
常见的性能影响因素
数据库结构设计要保持以下原则:
1.了解业务,性能只是附属属性;
2.优先考虑第三范式设计;
3.表的关联尽可能少,及在可能的情况虾适当的使用一些冗余字段;
4.坚持最小原则:说白了就是表字段的大小要设计的刚刚好;
5.在适当的地方使用约束。
T-SQL语句编写的原则:
1.完全了解业务需求,知道表的用途和用法;
2.要学会判断过滤字段能否使用索引;
3.不要对有索引的字段做任何计算,否则会使索引失效;
4.小表操作有限,查询时以小表驱动大表;
5.只查询有效字段,避免查询全部字段;
6.尽量使用简单的SQL语句来实现业务功能(表关联不超过4个,过滤条件2-3个并且有一个过滤条件可以明确使用索引查找)。
7.学会使用执行计划进行性能对比查询。
SQL语句会造成索引失效的几种情况:
1.查询条件中含有or关键字;
2.where条件中使用标量函数操作;
3.like条件左侧有%;
4.where条件中含有运算;
5.where条件中有类型转换
6.where条件中IS NULL /IS NOT NULL。
建立索引的原则:
1.定义主键的数据列一定要建立索引。
2.定义有外键的数据列一定要建立索引。
3.对于经常查询的数据列最好建立索引。
4.对于需要在指定范围内的快速或频繁查询的数据列;
5.经常用在WHERE子句中的数据列。
6.经常出现在关键字order by、group by、distinct后面的字段,建立索引。如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致,否则索引不会被使用。
索引优化:
1.索引不是越多越好,索引过多,会干扰查询优化器分析,存储空间大,维护空间大。要适当的做优化合并,单表索引总数控制在5个以内。
2.以复合索引代替单列索引。
3.合理设置索引的首列:
1)首列的选择度尽可能高,就是首列的唯一值尽可能多;
2)首列的类型尽可能小,少用字符串。
选择首列公式:
select (select count (discount 列)*1.0 from 表)/(select count (1) from 表 ) --越小代表选择度越高
4.合理使用include包含配合复合索引使用;
5.数据唯一性差(一个字段的取值只有几种时)的字段不要使用索引。比如性别,只有两种可能数据。意味着索引的二叉树级别少,多是平级。这样的二叉树查找无异于全表扫描;
6.对于那些查询中很少涉及的列不建议使用索引;
7.对于定义为text、image、guid和bit的数据类型的列不建议建立索引;
8.对于频繁数据操作的列不要使用索引,因为每次操作都会导致索引重新排序,导致维护性能降低;
9.首列相同的索引,可以根据实际情况适当合并;
使用DMV查询索引缺失情况,性能占比:
以下是具体的sql和说明:
查询后的结果:
我们可以根据实际情况来对缺失索引的查询进行监控及优化。