加快MySQL查询/ 290万行/多个联接

时间:2019-01-20 20:48:13

标签: mysql sql query-optimization query-performance

由于一个表包含2.9m行以及与其他表的联接,因此我的查询运行速度非常慢。我已经设法减少了一半的执行时间,但还不够快。

有人对我还能做什么有任何想法吗?数量,entityId,merchant.name,channel.uuid和channel.sender列均已编制索引。

这是原始查询,需要11秒...

SELECT 
    SUM(t.amount) AS amount, 
    m.name 
FROM 
    transactionsV2 t
    JOIN channels c ON t.entityId = c.uuid
    JOIN merchants m ON c.sender = m.uuid
WHERE 
    t.paymentType = "DB"
    AND t.status = 1
    AND t.processing_time >= "2019-01-19 00:00:00"
    AND t.processing_time <= "2019-01-20 23:59:59"
GROUP BY m.uuid
ORDER BY m.name

这是重做的查询,耗时4.5秒...

SELECT 
    SUM(t1.amount) AS amount, 
    m.name 
FROM
    (
        SELECT t.amount, t.entityId 
        FROM transactionsV2 t
        WHERE 
            t.paymentType = "DB"
            AND t.status = 1
            AND t.processing_time >= "2019-01-19 00:00:00"
            AND t.processing_time <= "2019-01-20 23:59:59"
    ) t1
    JOIN channels c ON t1.entityId = c.uuid
    JOIN merchants m ON c.sender = m.uuid
GROUP BY m.name

下面是所有3个表的表结构。

enter image description here

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:0)

查看您的代码,确保您在

上具有复合索引
transactionsV2 (paymentType, status, processing_time, entityId, amount)

channels (sender, uuid)

merchants ( uuid, name)

答案 1 :(得分:0)

我将从没有派生表的查询重写开始:

SELECT SUM(t.amount) AS amount, 
       m.name 
FROM transactionsV2 t JOIN
     channels c
     ON t.entityId = c.uuid JOIN
     merchants m
     ON c.sender = m.uuid
WHERE t.paymentType = 'DB' AND
      t.status = 1 AND
      t.processing_time >= '2019-01-19' AND
      t.processing_time < '2019-01-21'
GROUP BY m.name;

然后,您希望索引包含每个表的所有列。假设transactionsV2是一个表,则:

  • transactionsV2(paymentType, status, processing_time, entityId, amount)
  • channels(uuid, sender)
  • merchants(uuid, name)

我们的想法是首先从WHERE开始使用相等条件的列。

如果transactionsV2是一个视图,那么您可能会不走运,因为MySQL使得优化视图变得困难(不可能?)。

相关问题