mySQL - UNION 语句的性能

标签 mysql sql subquery dynamic-queries

我需要组合两个具有相同列的表,并在复杂的 JOIN 查询中使用结果,但这会大大降低性能。此带有 UNION 的查询的执行时间为 7 秒:

SELECT DISTINCT `admin`.`Fund_ID`,
                `admin`.`Fund_Name`
FROM (
        (SELECT *
         FROM `admin`)
      UNION
        (SELECT *
         FROM `admin_custom`
         WHERE `user_id`=361)) admin
LEFT JOIN (
             (SELECT *
              FROM `quant1`)
           UNION
             (SELECT *
              FROM `quant1_cust`
              WHERE `user_id`=361)) quant1 
ON (quant1.`Fund ID`=`admin`.`Fund_ID`)
WHERE quant1.`VaR 95`>-0.028

但是用一个简单的表替换 UNION 子句只需 0.006 秒。如何解决性能问题?

最佳答案

您可以对数据库进行“附加更改”,以在 UNIONED 表之间创建通用性。这将是一次重构,仅添加表和列,从而保持与未更改的应用程序代码的读取兼容性。

在此示例中,您将在admin“左侧”创建一个公用表。和admin_custom然后将其加入其中。这将包含基金 ID、类型(以便您知道您要加入哪个)以及(如果可能)其他有用的常见列。

您还可以在quant1“左侧”创建一个公用表。和quant1_cust然后将从 that 加入。

然后,您可以更改查询以使用公共(public)表中的基金 ID 链接,将 UNION 子句替换为“公共(public)表”(如果可能)或 "Common Table" left outer join Legacy1 left outer join Legacy2 .

我不明白这些表到底是什么,所以我无法帮助您进行合理的命名。 (命名是设计中最重要的部分,您应该在问题中解释这一点。)

但是这种方法对于我领导的一个大型政府项目确实非常有效,其中公用表是 DOCUMENT 和 DOC_ELEMENT。具有 8 种不同文档类型且没有预先存在的共性的树形结构文档。

在我们的例子中,文档被添加到 RFP、TENDER、PRICEPLAN 等的“左侧”,并提供了通用性。

这不是完全向后兼容——您需要更改应用程序的 INSERT 代码。如果您要进行重构,您可能需要考虑将相同的表结构放入同一个表中

最好的办法是尝试可能的结构,验证可能的性能,并找出需要更改哪些代码。然后您可以选择一条轨迹。

关于mySQL - UNION 语句的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19263400/

相关文章:

mysql - 在 MySQL 中使用子查询进行 DELETE

php - 从 PHP 对 MysqlQuery 强制超时

mysql - 具有相互用户关系的 SQL 查询

php - 使用 PHP 从 MySQL 读取 Unicode 字符

mysql - 我的代码显示错误的排名值

php - 如何用php创建下拉菜单?

postgresql - 在 sqlalchemy 中的有序子查询上加入 DISTINCT ON

mysql - 当 MySQL 行更新时,如何防止时间戳列更新?

sql - DB2 和 Oracle 上的扫描/更新操作统计信息

mysql - 我如何在 mysql 中重用子查询?