MySQL JOIN 和 SUM 性能问题

标签 mysql join

我在 MySQL JOIN 和 SUM 方面遇到问题。因为我的 JOIN 有多个匹配项,所以我将在 JOIN 中执行 SELECT,这样总和就不会太多。

问题:
我的查询速度非常慢。在下面的测试设置中,在没有任何索引的情况下,它的运行时间仅为 1 毫秒。但在我的生产数据库上,当仅选择一条记录 (WHERE id = X) 时,此查询大约需要 4 秒。

表 a 有约 700.000 条记录
表 b 有约 800.000 条记录
表 c 有约 45.000 条记录

表a在id上有索引
表 b 在 ida_id
上有索引 表 c 在 ida_id

上有索引

下面是简化的表格和使用的查询。

a

id
---
1

b

id | a_id | amount | price
--------------------------
 1 |    1 |      1 |    25
 2 |    1 |      1 |    20

c

id | a_id | amount | price
--------------------------
 1 |    1 |      1 |    23
 2 |    1 |      1 |    20

查询:
现在,当我运行此查询来获取表 a 中引用的 bc 的总和时。

SELECT id, bPrice, cPrice
FROM a
LEFT JOIN (SELECT a_id, SUM(amount * price) AS bPrice FROM b GROUP BY a_id) bb ON a.id = bb.a_id
LEFT JOIN (SELECT a_id, SUM(amount * price) AS cPrice FROM c GROUP BY a_id) cc ON a.id = cc.a_id

结果错误但速度很快

SELECT 
    a.id,
    SUM(b.amount * b.price) AS bPrice,
    SUM(c.amount * c.price) AS cPrice
FROM a
JOIN b ON a.id = b.a_id
JOIN c ON a.id = c.a_id;

SQL Fiddle example

最佳答案

MySQL 将很难从子查询中提取索引来进行连接,并且怀疑您正在连接子查询中的大量行。

作为第一步,您可以尝试删除其中一个子查询,将其更改为针对主表的联接。

SELECT id, 
        SUM(b.amount * b.price) AS bPrice, 
        cPrice
FROM a
LEFT OUTER JOIN b ON a.id = b.a_id
LEFT OUTER JOIN 
(
    SELECT a_id, 
            SUM(amount * price) AS cPrice 
    FROM c 
    GROUP BY a_id
) cc ON a.id = cc.a_id
GROUP BY a.id,
        cc.cPrice

关于MySQL JOIN 和 SUM 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41099026/

相关文章:

php - 使用 PHP 从字符串进行多个 MySQL 更新

php - 使用 UNION 查询在 while 语句中获取总数

MySQL连接问题

PHP/MySQL - 连接/联合两个表的结果

php - 我如何正确地 `JOIN` 这些表?

mysql - LEFT JOIN 的 WHERE 条件未显示正确的结果

wm_concat 的 mysql equi

PHP - mySQL 查询问题

Mysql查询follow关注者系统

php - 在 PHP + MySQL 中,如何使用条件连接多个表