更新时间:2023-03-13 GMT+08:00
分享

高性能编码规范

可以通过优化表结构、业务代码逻辑等提高性能。

  • 减少复杂接口设计
    • 单个服务不要实现太多的功能,服务越复杂可重用性越差。
    • 单个服务不要返回太多的数据,包括记录数以及关联数据。
  • 表结构优化
    • 常用的查询条件字段创建索引,创建索引时区分度大的字段放在前面。
    • 不要对所有字段建立索引,太多的索引会导致增删改变慢,且维护成本升高。
  • 业务逻辑优化
    • 多表关联查询:不要使用超过两个表的关联查询。

      错误示例:

    • 重复查询:不要在循环内重复使用同一条件查询,应该在循环外处理。不要在同一个脚本的多个方法内使用同一条件多次查询,可以定义类的成员变量。

      错误示例:

    • 非必要的关联查询:关联的条件很多情况下都是唯一的,可以提前做单独查询。

      错误示例(如下两个关联查询,均是为了获取Device ID):

    • 不要在循环内,每条记录都去查询一次数据库,频繁的数据库交互,会严重影响性能。

      例如,查询5000条数据,查询补充数据时,不要在循环内多次交互数据库,把可以合并的条件在循环外拼接并进行一次性查询,在循环内只需要从结果集中获取数据,可以极大提升查询性能。

      错误示例:

    • 利用对象做临时缓存

      例如,查询到DeviceDef后,按照id:Object的方式存起来,后续查询时先判断缓存对象中是否已存在,如果存在则直接获取不再查询。

    • SQL拼接应该尽量避免可能导致使用不到索引的情况。
      如下操作,可能会导致索引无效:
      • 在索引字段上,使用like进行查询匹配。
        错误示例:
        explain for select name from de_devices where name like 'bbb';
      • 使用or语句做SQL拼接。
        错误示例:
        explain for select name from de_devices where name = 'bbb' or id = '050C000000SDVhsWIpsn';
      • 多个字段建立组合索引,但仅使用了部分字段作为查询条件,索引失效。
        错误示例:
        explain for select name from de_devices where externalcode = 'bbb';
      • 数据类型出现隐式转化,例如数字转型为文本,使索引无效,产生全表扫描。
        错误示例:
        explain for select name from de_devices where name  = 123;
      • 在索引列上,使用IS NULL或IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理。

        错误示例:

        explain for select name from de_devices where name is not null;

        数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可。

      • 在索引字段上,使用“<>”,它的处理只会产生全表扫描。

        优化方法: key<>0改为key>0 or key<0

        错误示例:

        explain for select name from de_devices where name <> 'bb';
      • 对索引字段进行计算操作、字段上使用函数。
        错误示例:
        explain for select name from de_devices where lower(name) =  'bbb';
分享:

    相关文档

    相关产品