由于一个表包含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个表的表结构。
答案 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使得优化视图变得困难(不可能?)。