优化的策略

一共两种:

  1. 减少IO(查询)的次数
  2. 加快单次查询的速度

关于习惯

一次返回以及分步查询的取舍

取舍:

  • 将所有的数据放到一次查询中返回,相比较于分步获取,有IO次数上的优势
  • 一次返回必定会join更多的表,故查询效率肯定会下降

优化方案:

  • 分步获取可以借助缓存来提升性能
  • 对于一次查询,join使用的连接词尽量包含索引

    join 子查询&视图

  • 对视图进行join操作相当于对子查询的join操作

  • 子查询的返回集尽可能要小

    递归查询

    对于某些具有层级关系的数据,有可能会产生递归查询

  • 递归查询的检索效率是不确定的,时间复杂度为O(n^k),应该尽量避免使用递归查询

    • 可以增加冗余字段来避免递归查询
      • 例如:假设在一张具有层级关系数据的表(有子级、父级、祖父级)中,每条记录都存放它的祖父的主键信息,这样在查询某个子级的祖父级信息时,就可以避免递归查询
    • 可以增加额外的表来维护父子关系
  • 如果递归不可避免,可以使用数据库的存储函数来替代在代码中使用递归,这样可以有效减少IO次数

    去重

    通常情况下,使用group by的效率要高于distinct

    关于索引

    特性

  • 索引将增加被索引字段的查询效率,但是同时也会提升维护成本

    建议使用的场景

  1. 频繁用于检索的字段
  2. 与操作相关的字段
    1. join使用的字段
    2. order by使用的字段
    3. group by使用的字段