1. 采用绑定变量的方式。
? ? ? ?绑定变量是解决动态语句硬解析的利器。如果sql执行频度较高,但处理的数据量较少,结果集也相对较小,sql语句的解析时间也会接近或高于执行时间,此时就应该采用绑定变量的方式,这样就能减少sql语句编译时间,提高sql语句执行效率。
?
2. 在where字句中尽量采用like来匹配,而不用字符串截取函数substr。
? ? ? 在使用like的时候,应尽量使用右匹配(a%),而不使用全匹配(%a%)和左匹配(%a),使用右匹配可以提供较多的数据降低查询开销。
?
3. select字句中只取所需要的字段。
? ? ? 每个不需要的列的都会消耗一定的性能。
?
4. 避免不必要的数据格式转换。
? ? ?4.1 主外键的数据类型一定要一致,避免在join连接查询时产生数据类型转换,消耗性能。
? ? ?4.2 如果需要数据类型转换,尽量在程序中完成。
? ? ?4.3 对于较短的列,尽量使用字符类型,而不是可变字符类型;尽量使用整数,而不是浮点数;尽量使用日期,而不是字符;尽量使用数字,而不是字符。
?
5. 尽量不用视图。
?
6. 如果需要插入或更新大批量数据,尽量使用批处理。
? ? ? 如果是一条一条执行,则性能低下,应该采用批处理,但是批处理也要控制数量,如果数量太大,可能会造成数据库锁表。
?
7. 避免在sql语句上进行计算。
?
8. 不要在in语句里放太多的值。
? ? ? 通过IN语句可以减少sql的调用次数,但是如果IN语句里的值的个数过多的话,会导致执行计划的不稳定和sql性能下降。一般IN语句里的个数在20个以下性能较好,20个以上100个以下性能不变,超过100个则性能可能会下降。
?
9. 在查询范围时尽量使用闭区间。
?
10. 不能用包含null值的列做索引。
? ? ? ?任何包含null值的列都不会被包含在索引中。即使索引有多列,但只要有一列包含null值,该列就会从索引中删除,也就是说如果某一列存在null值,即使对该列建索引,也不会提高查询效率。
?
11. 尽量避免使用嵌套查询。
? ? ? ?嵌套的层次越深,效率越低。可以采用的办法是,将子查询单独提出来,分多步完成。如果子查询无法避免,应尽量在子查询中过滤掉尽可能多的行。或者考虑进行连接查询。
?
12. 尽量避免使用distinct关键字。
? ? ? ? 使用distinct是为了保证在查询结果集中不出现重复行,但是distinct会产生一张工作表,并进行排序来删除重复,这会大大增加查询和I/O的次数。
?
13. 避免在order by字句中使用表达式。
? ? ? ?避免对3个以上的字段进行排序。 ? ? ?
?
14. 索引的使用。
? ? ? 14.1 避免5个以上字段的组合索引。
? ? ? 14.2 避免在一张表里建6个以上的索引。
? ? ? 14.3 查询列和排序列与索引列的次序一致。
? ? ? 14.4 使用组合索引时,应确保组合索引的第一个字段出现在查询条件中。
? ? ? 14.5 不要在含有大量重复列上建索引,没有任何意义。
? ? ? 14.6 索引应该创建在更新或删除操作比较少的表上。索引的目的是为了提高查询效率,但是相应会带来负面影响:如果数据更新或删除操作比较频繁,索引也会进行同步更新,这会影响更新和删除操作的效率。
?
?
?
?
?
?