优化的策略
一共两种:
- 减少IO(查询)的次数
- 加快单次查询的速度
关于习惯
一次返回以及分步查询的取舍
取舍:
- 将所有的数据放到一次查询中返回,相比较于分步获取,有IO次数上的优势
- 一次返回必定会join更多的表,故查询效率肯定会下降
优化方案:
- 分步获取可以借助缓存来提升性能
-
join 子查询&视图
对视图进行join操作相当于对子查询的join操作
-
递归查询
对于某些具有层级关系的数据,有可能会产生递归查询
递归查询的检索效率是不确定的,时间复杂度为O(n^k),应该尽量避免使用递归查询
- 可以增加冗余字段来避免递归查询
- 例如:假设在一张具有层级关系数据的表(有子级、父级、祖父级)中,每条记录都存放它的祖父的主键信息,这样在查询某个子级的祖父级信息时,就可以避免递归查询
- 可以增加额外的表来维护父子关系
- 可以增加冗余字段来避免递归查询
如果递归不可避免,可以使用数据库的存储函数来替代在代码中使用递归,这样可以有效减少IO次数
去重
通常情况下,使用group by的效率要高于distinct
关于索引
特性
-
建议使用的场景
- 频繁用于检索的字段
- 与操作相关的字段
- join使用的字段
- order by使用的字段
- group by使用的字段
