SQL语句优化方法
1.1 注释使用
在语句中多写注释,注释不影响sql语句的执行效率。增加代码的可读性。
1.2 对于事务的使用
尽量使事务处理达到最短,如果事务太长最好按功能将事务分开执行(如:可以让用户在界面上多几步操作)。事务太长很容易造成阻塞,用户操作速度变慢或死机情况。
1.3 对于与数据库的交互
尽量减少与数据库的交互次数。如果在前端程序写有循球访问数据库操作,最好写成将数据一次读到前端再进行处理或者写成存储过程在数据库端直接处理。
1.4 对于select *这样的语句,
不要使用select *这样的语句,而应该使用select table1.column1这样的语句,明确指出要查询的列减少数据的通讯量并且这样的代码可读性好,便于维护。
1.5 尽量避免使用游标
它占用大量的资源。如果需要row-by-row地执行,尽量采用非光标技术,如:在客户端循环,用临时表,table变量,用子查询,用case语句等等。如果使用了游标,就要尽量避免在游标循环中再进行表连接的操作。
1.6 尽量使用count(1)
count函数只有在统计表中所有行数时使用,而且count(1)比count(*)更有效率。
1.7 in和exists
exists要远比in的效率高。里面关系到full table scan和range scan。几乎将所有的in操作符子查询改写为使用exists的子查询。
1.8 注意表之间连接的数据类型
避免不同类型数据之间的连接。
1.9 尽量少用视图
对视图操作比直接对表操作慢,可以用stored procedure来代替她。特别的是不要用视图嵌套,嵌套视图增加了寻找原始资料的难度。我们看视图的本质:它是存放在服务器上的被优化好了的已经产生了查询规划的sql。对单个表检索数据时,不要使用指向多个表的视图,直接从表检索或者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰。
1.10 没有必要时不要用distinct和order by
这些动作可以改在客户端执行,它们增加了额外的开销。
1.11 避免相关子查询
一个列的标签同时在主查询和where子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。
1.1 注意union和`union all 的区别
union all执行效率高。
1.1 外键关联的列应该建立索引
(如子表id)主子表单据肯定要建视图,2个表的关联以2个表中的mainid为关系,所以,需要给子表的mainid单独建索引,这将很大地提高视图的速度。例如gy_inoutsub中的inoutmainid增加索引。