热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

在保持逻辑的同时进行JOIN子查询-SubqueriestoJOINwhilekeepinglogic

ImtryingtooptimizeaslowqueryandIvecomeacrossthefollowing(runningconsistentlyover8

I'm trying to optimize a slow query and I've come across the following (running consistently over 8 seconds).

我正在尝试优化慢速查询,我遇到了以下情况(持续运行超过8秒)。

SELECT entryID, entryID AS iE, 0 AS eE, 'clarus1' AS locationID, dateStamp, amount AS income, NULL AS expense, reconciled, leaseID AS vendorID, incomeID AS expenseID
FROM structu_income.iLedger 
WHERE (dateStamp BETWEEN '2009-04-16' AND '2012-02-29') AND incomeID IS NOT NULL
    AND (
        leaseID IN (
            SELECT lease.leaseID FROM structu_assets.lease WHERE lease.unitID IN (
                SELECT unit.unitID FROM structu_assets.unit WHERE unit.locatiOnID= 'clarus1'
            )
        )
        OR locationID IN (SELECT locationID FROM structu_assets.deed WHERE ownerID = 'clarus')
    )

Here's the EXPLAIN:

这是EXPLAIN:

enter image description here

My thought was to refactor the subqueries to use JOIN. But keeping the logical OR is throwing me off.

我的想法是重构子查询以使用JOIN。但保持合乎逻辑的OR会让我失望。

In addition, the nested subqueries seem inevitable. Unless I predetermined the unitID in a separate query.

此外,嵌套的子查询似乎是不可避免的。除非我在单独的查询中预先确定unitID。

I'm not the original developer. But I'm charged with making it more performant without modifying the existing codebase or schema. So I'm attempting the pick off the slow queries.

我不是原来的开发者。但是我负责在不修改现有代码库或架构的情况下使其更高性能。所以我正在尝试挑选慢速查询。

As an aside, do cross database queries take a performance hit?

另外,交叉数据库查询是否会受到性能影响?

2 个解决方案

#1


1  

add an index to your dateStamp column.

在dateStamp列中添加索引。

use :

dateStamp > '2009-04-16' AND dateStamp <'2012-02-29'

instead of :

代替 :

dateStamp BETWEEN '2009-04-16' AND '2012-02-29'

it's more efficient.

它效率更高。

Finally, you can write a loop in PHP instead of subqueries.

最后,您可以在PHP中编写循环而不是子查询。

#2


1  

It would be interesting to see if this answer a) works and b) is faster. Try this:

看看这个答案a)是否有效以及b)是否更快将会很有趣。尝试这个:

SELECT
    il.entryID,
    il.entryID AS iE,
    0 AS eE,
    'clarus1' AS locationID,
    il.dateStamp,
    il.amount AS income,
    NULL AS expense,
    il.reconciled,
    il.leaseID AS vendorID,
    il.incomeID AS expenseID
FROM
    structu_income.iLedger il
    INNER JOIN structu_assets.lease l ON il.leaseID = l.leaseID
    INNER JOIN structu_assets.unit u ON l.unitID = u.unitID AND u.locatiOnID= 'clarus1'
WHERE
    il.dateStamp BETWEEN '2009-04-16' AND '2012-02-29'
    AND il.incomeID IS NOT NULL
UNION
SELECT
    il.entryID,
    il.entryID AS iE,
    0 AS eE,
    'clarus1' AS locationID,
    il.dateStamp,
    il.amount AS income,
    NULL AS expense,
    il.reconciled,
    il.leaseID AS vendorID,
    il.incomeID AS expenseID
FROM
    structu_income.iLedger il
    INNER JOIN structu_assets.deed d ON il.locatiOnID= d.locationID AND d.ownerID = 'clarus'
WHERE
    il.dateStamp BETWEEN '2009-04-16' AND '2012-02-29'
    AND il.incomeID IS NOT NULL

The first SELECT query takes care of the first half of your OR conditions, and the second SELECT query adds in the results for the second half. And you shouldn't get duplicate rows with UNION so I believe you should get the same results.

第一个SELECT查询负责OR条件的前半部分,第二个SELECT查询添加后半部分的结果。你不应该用UNION获得重复的行,所以我相信你应该得到相同的结果。


推荐阅读
  • Spring – Bean Life Cycle
    Spring – Bean Life Cycle ... [详细]
  • 本文详细介绍了 PHP 中对象的生命周期、内存管理和魔术方法的使用,包括对象的自动销毁、析构函数的作用以及各种魔术方法的具体应用场景。 ... [详细]
  • 本文将带你快速了解 SpringMVC 框架的基本使用方法,通过实现一个简单的 Controller 并在浏览器中访问,展示 SpringMVC 的强大与简便。 ... [详细]
  • MySQL Decimal 类型的最大值解析及其在数据处理中的应用艺术
    在关系型数据库中,表的设计与SQL语句的编写对性能的影响至关重要,甚至可占到90%以上。本文将重点探讨MySQL中Decimal类型的最大值及其在数据处理中的应用技巧,通过实例分析和优化建议,帮助读者深入理解并掌握这一重要知识点。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 如何撰写适应变化的高效代码:策略与实践
    编写高质量且适应变化的代码是每位程序员的追求。优质代码的关键在于其可维护性和可扩展性。本文将从面向对象编程的角度出发,探讨实现这一目标的具体策略与实践方法,帮助开发者提升代码效率和灵活性。 ... [详细]
  • 如何撰写初级和高级前端开发者的专业简历
    如何撰写初级和高级前端开发者的专业简历 ... [详细]
  • 在处理遗留数据库的映射时,反向工程是一个重要的初始步骤。由于实体模式已经在数据库系统中存在,Hibernate 提供了自动化工具来简化这一过程,帮助开发人员快速生成持久化类和映射文件。通过反向工程,可以显著提高开发效率并减少手动配置的错误。此外,该工具还支持对现有数据库结构进行分析,自动生成符合 Hibernate 规范的配置文件,从而加速项目的启动和开发周期。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • 资源管理器的基础架构包括三个核心组件:1)资源池,用于将CPU和内存等资源分配给不同的容器;2)负载组,负责承载任务并将其分配到相应的资源池;3)分类函数,用于将不同的会话映射到合适的负载组。该系统提供了两种主要的资源管理策略。 ... [详细]
  • React项目基础教程第五课:深入解析组件间通信机制 ... [详细]
  • HBase Java API 进阶:过滤器详解与应用实例
    本文详细探讨了HBase 1.2.6版本中Java API的高级应用,重点介绍了过滤器的使用方法和实际案例。首先,文章对几种常见的HBase过滤器进行了概述,包括列前缀过滤器(ColumnPrefixFilter)和时间戳过滤器(TimestampsFilter)。此外,还详细讲解了分页过滤器(PageFilter)的实现原理及其在大数据查询中的应用场景。通过具体的代码示例,读者可以更好地理解和掌握这些过滤器的使用技巧,从而提高数据处理的效率和灵活性。 ... [详细]
  • Spring框架中的面向切面编程(AOP)技术详解
    面向切面编程(AOP)是Spring框架中的关键技术之一,它通过将横切关注点从业务逻辑中分离出来,实现了代码的模块化和重用。AOP的核心思想是将程序运行过程中需要多次处理的功能(如日志记录、事务管理等)封装成独立的模块,即切面,并在特定的连接点(如方法调用)动态地应用这些切面。这种方式不仅提高了代码的可维护性和可读性,还简化了业务逻辑的实现。Spring AOP利用代理机制,在不修改原有代码的基础上,实现了对目标对象的增强。 ... [详细]
author-avatar
半邪书生66_516
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有