当前位置: 首页 > 知识库问答 >
问题:

MySQL联合性能问题

康言
2023-03-14

我有3个表(SuccessOrder、FailedOrder和PendingOrder)具有相同的列。每个表都有超过200万条记录。我需要组合来自这3个表的所有数据,并按CreatedDate对它们进行排序,以显示在我的门户中。我正在使用UNION ALL组合所有表的结果。

如果我执行每个子查询,在1或2秒内得到结果。如果我执行整个查询(带有UNION ALL的3个子查询),则需要超过5分钟。

select * from (
select * from SuccessOrder
UNION ALL
select * from FailedOrder
UNION ALL
select * from PendingOrder
) t order by t.ID;

除了联合,还有别的选择吗?

是否可以从3个查询中创建视图而不使用UNION ALL?

以下是从Workbench测试的单个和联合查询。我看不出UNION ALL和UNION ALL-ORDER BY有多大区别

第一个查询

持续时间/提取时间:2.182秒/1.513秒

SELECT  col1, col2, ...
    FROM  CompleteTxn ct
    left outer join  CompleteItem ci  ON (ct.Id = ci.TxnId)
    left outer join  ItemDispute id  ON (ct.Id = id.TxnId and  ci.Id = id.ItemId )
    left outer join  Merchant mc  ON (ct.MerchantId = mc.Id)
    left outer join  AdditionalTxnInfo addti  ON (ct.Id = addti.TxnId)
    where  (ct.PartitionKey>=55 AND  ct.PartitionKey<=56 )
      and  ( ct.TxnCompleteTime >= '2016-08-01 17:00:00'
        and  ct.TxnCompleteTime <= '2016-08-09 17:00:00'
           )
      and  ct.MnoId in (22,24,25,23,26,220,221,200,223,224,320, 400)
      and  ct.Status in (1,2,3,4,5);

第二次查询

持续时间/提取时间:0.279秒/0.861秒

SELECT  col1, col2, ...
    FROM  FailedOrder ct
    left outer join  FailedItem ci  ON (ct.Id = ci.TxnId)
    left outer join  ItemDispute id  ON (ct.Id = id.TxnId and  ci.Id = id.ItemId )
    left outer join  Merchant mc  ON (ct.MerchantId = mc.Id)
    left outer join  AdditionalTxnInfo addti  ON (ct.Id = addti.TxnId)
    where  (ct.PartitionKey>=55 AND  ct.PartitionKey<=56 )
      and  ( ct.TxnCompleteTime >= '2016-08-01 17:00:00'
        and  ct.TxnCompleteTime <= '2016-08-09 17:00:00'
           )
      and  ct.MnoId in (22,24,25,23,26,220,221,200,223,224,320, 400);

[法]联合

持续时间/提取时间:104.802秒/0.00027秒

select  *
    FROM  
    (
        SELECT  col1, col2, ...
            FROM  FailedOrder ct
            left outer join  FailedItem ci  ON (ct.Id = ci.TxnId)
            left outer join  ItemDispute id  ON (ct.Id = id.TxnId
                      and  ci.Id = id.ItemId 
                          )
            left outer join  Merchant mc  ON (ct.MerchantId = mc.Id)
            left outer join  AdditionalTxnInfo addti  ON (ct.Id = addti.TxnId)
    where  (ct.PartitionKey>=55 AND  ct.PartitionKey<=56 )
      and  ( ct.TxnCompleteTime >= '2016-08-01 17:00:00'
        and  ct.TxnCompleteTime <= '2016-08-09 17:00:00'
           )
      and  ct.MnoId in (22,24,25,23,26,220,221,200,223,224,320, 400)
              and  ct.Status in (1,2,3,4,5)
    UNION  ALL 
        SELECT  col1, col2, ...
            FROM  CompleteTxn ct
            left outer join  CompleteItem ci  ON (ct.Id = ci.TxnId)
            left outer join  ItemDispute id  ON (ct.Id = id.TxnId
                      and  ci.Id = id.ItemId
                          )
            left outer join  Merchant mc  ON (ct.MerchantId = mc.Id)
            left outer join  AdditionalTxnInfo addti  ON (ct.Id = addti.TxnId)
    where  (ct.PartitionKey>=55 AND  ct.PartitionKey<=56 )
      and  ( ct.TxnCompleteTime >= '2016-08-01 17:00:00'
        and  ct.TxnCompleteTime <= '2016-08-09 17:00:00'
           )
      and  ct.MnoId in (22,24,25,23,26,220,221,200,223,224,320, 400)        ) t ;

使用order by联合All

持续时间/提取时间:104.895秒/0.00028秒

选择*FROM(

从FailedOrder ct left outer join FailedItem ci ON(ct.id=ci.TxNID)left outer join ItemPartition id ON(ct.id=id.TxNID和ci.id=id.ItemID)left outer join Merchant mc ON(ct.MerchanID=mc.id)left outer join AdditionalTxnInfo addti ON(ct.id=addti.TxNID)其中(ct.PartitionKey>=55和ct.PartitionKey<=56)和(ct.TxnCompleteTime>=

UNION ALL

从CompleteTxn ct左外部连接CompleteItem ci ON(ct.id=ci.TxNID)左外部连接ItemPartition id ON(ct.id=id.TxNID和ci.id=id.ItemID)左外部连接Merchant mc ON(ct.MerchanID=mc.id)左外部连接AdditionalTxnInfo addti ON(ct.id=addti.TxNID)其中(ct.PartitionKey>=55和ct.PartitionKey<=56)和(ct.TxnCompleteTime>=“2016-08-01 17:00:00”和ct.TxnCompleteTime<=“

)通过id描述测试订单;

共有2个答案

龚运乾
2023-03-14

您的Order By很可能是这里的罪魁祸首。您实际上是在select之后对整个数据库进行排序,并且取决于它的索引方式,这可能需要很长时间。

你可以:

  • 确保表的索引是根据您的订购(重要)
  • 全部删除顺序

我不认为union all的成本接近于对所有数据进行排序的成本。

范朗
2023-03-14

根据我的假设,您正在处理大量的数据,几乎是600万条记录。

1)与Union相比,Union All的速度要快得多

2)将所有的select语句取到派生表中。

3)再次在ID上执行ORDER BY(性能问题)

如果您对庞大的数据进行排序,将会对性能产生巨大的影响。

所有的结果都是按顺序排序的,所以一定会增加排序成本百分比

select Col1,Col2 from SuccessOrder
UNION ALL
select Col1,Col2  from FailedOrder
UNION ALL
select Col1,Col2  from PendingOrder
 类似资料:
  • 问题内容: 我在查询中添加了,并终止了性能。添加之前和之后的解释计划是相同的,所以我对如何优化它感到困惑。 这是查询的简化版本: 请注意中的声明。在杀死性能。如果我注释该行并仅输出“ multiple make found”,它将很快执行。知道是什么原因造成的吗? 问题答案: 在此查询的原始非简化版本中,我们有个,它是完全不必要的,并导致group_concat出现性能问题。我不知道为什么会引起这

  • 真心求解! Mysql 两表联查,A表900w, B表1000w, 分页查询经过索引构建已经没什么问题, 但是count(id)的时候非常慢, 怎么优化 SELECT count(distinct A.id) FROM A INNER JOIN B ON A.id = B.bus_id WHERE A.trade_type in (0,1,2,4) and B.user_id IN (68305,

  • 我有5个SQL表 存储 工作人员 部门 SOLD_Items staff_rating 我创建了一个视图,将这四个表连接在一起。最后一个表(staff_rating),我希望在接近项目被出售的时间(sold_items.date)获得视图行的rating列。我尝试了以下SQL查询,这些查询工作正常,但存在性能问题。 SQL查询1 SQL查询2 SQL查询%2比SQL查询%1快。但这两种方法都存在性

  • 问题内容: 我正在测试MySQL作为SQL Server的替代产品,并且遇到了一些非常奇怪的事情。我正在测试插入和读取,并且以任何一种方式每秒最多处理约50个查询。 我的测试表如下所示: 我的C#测试程序如下所示: 似乎是一个相当简单的测试用例。在MySQL的安装中,尽管我必须将innodb的缓冲池从2G降低到1G,但我正在使用默认OLTP标准服务器设置运行32位。我不知道瓶颈在哪里。MySQL数

  • 本文向大家介绍MySQL延迟关联性能优化方法,包括了MySQL延迟关联性能优化方法的使用技巧和注意事项,需要的朋友参考一下 【背景】   某业务数据库load 报警异常,cpu usr 达到30-40 ,居高不下。使用工具查看数据库正在执行的sql ,排在前面的大部分是: 表的数据量大致有36w左右,该sql是一个非常典型的排序+分页查询:order by col limit N,OFFSET M

  • 问题内容: 我在比较MySQL数据库的写入性能方面比较了node.js和PHP。我正在从此处使用Apache Benchmark,虚拟机中的Linux Mint,最新的mysql- server(5.5.43)和用于带有node.js的MySQL驱动程序。我使用的代码是 server.js index.php 使用index.php文件的Apache Benchmark到Apache2服务器 PH