兰州网站建设加王道下拉,网站开发顶岗报告,安阳网站制作哪家好,福州网站制作哪里好一、背景
在做code review的时候#xff0c;经常会发现#xff0c;因为开发习惯问题#xff0c;很多研发人员喜欢在for循环中查询数据库。今天用一个真实例子#xff0c;记录一次查询性能优化的例子
二、示例
代码如下:
classmethod
fn_performance()
def get_task_ins…一、背景
在做code review的时候经常会发现因为开发习惯问题很多研发人员喜欢在for循环中查询数据库。今天用一个真实例子记录一次查询性能优化的例子
二、示例
代码如下:
classmethod
fn_performance()
def get_task_inst_info(cls, username, ids):获取巡检任务使用实例信息permission_host_list list()check_task_queryset CheckTask.objects.filter(id__inids, task__is_deletedFalse)for check_task in check_task_queryset:instance_permission_dict {instance: check_task.id, name: check_task.task.name, permission: True}instance_info list()obj_ids list(CheckTaskInst.objects.filter(check_taskcheck_task).values_list(obj_id, flatTrue))for obj_id in obj_ids:check_task_inst_queryset CheckTaskInst.objects.filter(check_taskcheck_task, obj_idobj_id)host_instance_list CheckTaskInstIAMSerializer(check_task_inst_queryset, manyTrue).datapermission_host HostIamService.screening_hosts_permissions(username, obj_id, host_instance_list, True)for _instance in permission_host:if not len(_instance[auth_actions]):instance_permission_dict.update({permission: False})instance_info.append({permission: False,inst_id: _instance.get(bk_host_id, _instance.get(bk_inst_id)),inst_name: _instance.get(bk_host_name, _instance.get(bk_inst_name)),})instance_permission_dict.update({instance_info: instance_info})permission_host_list.append(instance_permission_dict)return permission_host_list以上代码存在最大的问题是在循环中查询数据库 实例数量33个执行耗时3s左右
check_task_service.get_task_inst_info(admin,[108])
The [func_name: get_task_inst_info] [func: function CheckTaskService.get_task_inst_info at 0x000001F5108FA620]
[args:(class apps.general_check.service.check_task_service.CheckTaskService, admin, [108])]
[kwargs: {}]
[timer:3.47244s] [threshold:1s], please timely optimize.三、代码优化
优化思路不在循环中查询数据库 优化之后效果显著从3.4s降低到0.17s
check_task_service.get_task_inst_info(admin,[108])
The [func_name: get_task_inst_info] [func: function CheckTaskService.get_task_inst_info at 0x0000028FA5BB2620]
[args:(class apps.general_check.service.check_task_service.CheckTaskService, admin, [108])]
[kwargs: {}]
[timer:0.17271s] [threshold:0.1s], please timely optimize.优化后的代码 classmethodfn_performance(threshold0.1)def get_task_inst_info(cls, username, ids):获取巡检任务使用实例信息permission_host_list list()check_task_queryset CheckTask.objects.select_related(task).filter(id__inids, task__is_deletedFalse)check_task_inst CheckTaskInst.objects.filter(check_task_id__inids)check_task_inst_data {}for _task_inst in check_task_inst:check_task_inst_data.setdefault(f{_task_inst.check_task_id}-{_task_inst.obj_id}, []).append(_task_inst)for check_task in check_task_queryset:instance_permission_dict {instance: check_task.id, name: check_task.task.name, permission: True}instance_info list()obj_ids check_task.task.obj_ids.split(,) if check_task.task.obj_ids else []for obj_id in obj_ids:check_task_inst_list check_task_inst_data.get(f{check_task.id}-{obj_id})host_instance_list CheckTaskInstIAMSerializer(check_task_inst_list, manyTrue).datapermission_host HostIamService.screening_hosts_permissions(username, obj_id, host_instance_list, True)for _instance in permission_host:if not len(_instance[auth_actions]):instance_permission_dict.update({permission: False})instance_info.append({permission: False,inst_id: _instance.get(bk_host_id, _instance.get(bk_inst_id)),inst_name: _instance.get(bk_host_name, _instance.get(bk_inst_name))})instance_permission_dict.update({instance_info: instance_info})permission_host_list.append(instance_permission_dict)return permission_host_list