首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL连接和和性能问题

问MySQL连接和和性能问题
EN

Stack Overflow用户
提问于 2016-12-12 10:43:47
回答 3查看 916关注 0票数 2

我对MySQL连接和SUM有个问题。因为我的JOIN有多个匹配项,所以我将在联接中做一个选择,所以它不会加到多少。

问题:

我的查询非常慢。在下面的测试设置中,它只在1ms内运行,没有任何索引。但是在我的生产数据库中,当只选择一个记录(WHERE id = X)时,这个查询需要4秒。

表A有~700.000项记录

表b有800.000条记录

表c有45.000条记录

表a在id上有索引

表b有id,a_id的索引

表c有id、a_id的索引

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

表a

代码语言:javascript
复制
id
---
1

表b

代码语言:javascript
复制
id | a_id | amount | price
--------------------------
 1 |    1 |      1 |    25
 2 |    1 |      1 |    20

表c

代码语言:javascript
复制
id | a_id | amount | price
--------------------------
 1 |    1 |      1 |    23
 2 |    1 |      1 |    20

查询:

现在,当我运行这个查询以获得表b和c中有引用的和时,a。

代码语言:javascript
复制
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

错误结果但速度快

代码语言:javascript
复制
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示例

EN

回答 3

Stack Overflow用户

发布于 2016-12-12 11:04:47

MySQL将很难将索引从要连接的子查询中提取出来,并且怀疑您正在从子查询中加入许多行。

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

代码语言:javascript
复制
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
票数 2
EN

Stack Overflow用户

发布于 2016-12-12 10:54:51

尝试以下查询:

代码语言:javascript
复制
select set1.id,set1.bPrice,set2.cPrice from (SELECT a.id,SUM(b.amount * b.price) AS bPrice FROM a JOIN b ON a.id = b.a_id) as set1
JOIN
(SELECT a.id,SUM(c.amount * c.price) AS cPrice FROM a JOIN c ON a.id = c.a_id) as set2 ON set1.id = set2.id
票数 0
EN

Stack Overflow用户

发布于 2016-12-12 12:01:38

可能值得一试子查询--有时它们可能会更快:

代码语言:javascript
复制
SELECT 
    id, 
    (SELECT SUM(amount * price) AS bPrice FROM b where b.a_id = a.id) AS bPrice, 
    (SELECT SUM(amount * price) AS cPrice FROM c where c.a_id = a.id) AS cPrice
FROM a
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41099026

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档