摘了一段导致执行慢的条件,这种应该怎么优化 task.assignee_id_ = '123' AND ( ( task.STATUS_ = 'LOCK' and ( linkd.IDENTITY_ = '123' or linkd.TYPE_ != 'user' ) ) or task.STATUS_ != 'LOCK' ) 列 task.assignee_id_、linkd.IDENTITY_已经加了索引 linkd, status_, identity_
还有就是如果数据量这么小,完全可以在内存里做过滤 AND((task.STATUS_ = 'LOCK' and (linkd.IDENTITY_ = '123' or linkd.TYPE_ != 'user')) or task.STATUS_ != 'LOCK') 这后面的条件都可以去掉
把 or 拆成两个 sql 在数据里里试试两个哪个执行的慢,如果都快的话,看要不要就拆成两句直接 union 。如果分析出来哪个单句慢的话再针对单句继续优化 第一句 task.assignee_id_ = '123' AND ( task.STATUS_ = 'LOCK' and ( linkd.IDENTITY_ = '123' or linkd.TYPE_ != 'user' ) 第二句 task.assignee_id_ = '123' AND task.STATUS_ != 'LOCK'
可以考虑以下几点: 使用合适的索引:确保 task.assignee_id_和 linkd.IDENTITY_的索引是正确创建的。你提到已经添加了索引,但需要确保索引的创建方式正确,并且统计信息是最新的。可以使用数据库的索引优化工具或者执行计划分析来确认索引是否被有效使用。 优化逻辑表达式:该条件涉及多个逻辑运算符( AND 、OR ),可以尝试重新组织条件表达式,优化逻辑判断的顺序。例如,可以将常见的判断条件放在前面,以便更早地过滤掉不符合条件的记录。 考虑联合索引:如果 task.assignee_id_和 task.STATUS_、linkd.IDENTITY_和 linkd.TYPE_之间有相关性,可以考虑创建联合索引。联合索引可以更好地支持多个列的组合条件查询,提高查询效率。 数据库性能调优:除了索引优化外,还可以考虑其他数据库性能调优技术。例如,分析和优化查询计划、调整数据库配置参数、增加硬件资源等。 数据库版本升级:如果你使用的是较旧版本的数据库,可以考虑升级到最新版本,以获得更好的性能优化和查询优化器。 需要注意的是,优化查询的方法因数据库类型和版本而异。建议在具体情况下,结合数据库性能监控和优化工具,以及参考相关数据库的优化文档,针对具体的数据库系统进行优化调整。
简单做法 拆分 sql 你这样分行真的看着有点心态爆炸 原代码 task.assignee_id_ = '123' AND ( (task.STATUS_ = 'LOCK' and (linkd.IDENTITY_ = '123' or linkd.TYPE_ != 'user')) or task.STATUS_ != 'LOCK' ) 改进后 task.assignee_id_ = '123' and task.STATUS_ != 'LOCK' task.assignee_id_ = '123' and task.STATUS_ = 'LOCK' and linkd.IDENTITY_ = '123' task.assignee_id_ = '123' and task.STATUS_ = 'LOCK' and linkd.TYPE_ != 'user' 3 组数据按照你原本排序需求代码写下排序就行 如果 task.assignee_id_ = '123'查的结果并不多实际应该通过遍历过滤更快 数据库基本原则简单查询多次比复杂查询一次要快