数据库sql优化

时间:2021-02-25 23:27:59

1.数据库设计与规划
 1)primary key 字段的长度尽量小,能用small integer 就不要用integer。例如最好不要用身份证号做主键
 2)字符字段如果长度固定,就不要用varchar或nvarchar,应该使用char或nchar
 3)字符字段如果长度不固定,则应该使用varchar或nvarchar类型,可以节省存储空间,存取硬盘时效率比较好
 4)设计字段时,如果其值可有可无,最好也给一个默认值,并设置不允许为Null,有的数据库在存放和查询时会花费额外的运算,如MSSQL
2.适当的创建索引
 1)primary key字段可以自动创建索引,而foreign key字段不可以,为Foreign Key字段手动创建索引,即使是很少被JOIN的数据表也有必要这样做。
 2)为经常被查询或排序的字段创建索引
 3)创建索引字段的长度不宜太长,不要超过20个字节的字段,例如地址等。
 4)不要为内容重复性高的字段创建索引,例如性别等。
 5)不要为使用率低的字段建立索引。
 6)不要为过多字段建立索引,否则会影响到INSERT、UPDATE、DELETE语句的性能。
 7)如果数据库表存放的数据很少,就不比可以使用索引。
3.使用索引功能
 一下情况会使索引失效:
 1、在where语句中使用NOT、!=、<>、!>、!<、EXISTS、IN、LIKE、||
 2、使用LIKE关键字做模糊查询时,如果以%开头则不会使用索引,例如:name LIKE '%王',不启用name上的索引;而name LIKE '王%'会启用name字段上的索引。
4.避免在where自居中对字段使用函数
 调用函数的次数与数据表的记录成正比。如果记录很所时,会严重影响查询性能。
5.AND与OR的使用
 在AND运算中,只要有一个条件使用到索引,就可以大幅度提升查询速度。在OR运算中,则要所有的条件都有使用到索引才能提升查询速度,因此使用OR运算时要特别小心。
6.JOIN与子查询
 相对于子查询,如果能使用JOIN完成的查询,一般建议采用JOIN,因为JOIN语法较容易理解外,在多数情况下,JOIN的性能也会比子查询高。
7.其他查询技巧
 1)DISTINCT、ORDER BY 语法,会使数据库做额外的计算。
 2)如果没有要过滤重复记录的要求,使用UNION ALL会比UNION更好,因为后者会加入类似的DISTINCT的算法。
8.尽可能使用存储过程(Stored Procedure)
 Stored Procedure除了经过事先编译、性能较好以外,也可减少SQL语句在网络中的传递,方便商业逻辑的重复使用。
9.尽可能在数据源过滤数据
 使用SELECT语法时,尽量先用SQL条件或Stored Procedure过滤出索要的信息,避免将大量冗余数据返回给程序,然后由程序处理。