首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL在表本身的子查询中不删除

MYSQL在表本身的子查询中不删除
EN

Stack Overflow用户
提问于 2016-12-15 15:18:08
回答 2查看 33关注 0票数 1

我有以下查询,它显示具有一定保证金级别的帐户列表:

代码语言:javascript
复制
SELECT
    crm_margincall.id,
    crm_margincall.CreationTime,
    ba.name AS crm_bankaccount_id,
    crm_margincall.name,
    crm_margincall.MarginCallLevel,
    crm_margincall.UseOfEquityForMargin,
    crm_margincall.MarginRequired,
    crm_margincall.NetEquityForMargin,
    crm_margincall.MarginDeficit,
    crm_margincall.balance,
    crm_margincall.deposited,
    crm_margincall.prefunded,
    crm_margincall.required
FROM 
    crm_margincall
LEFT JOIN
    crm_bankaccount ba ON crm_margincall.crm_bankaccount_id = ba.id
WHERE 
    crm_margincall.name = 'MarginCall' 
AND 
    crm_margincall.MarginCallLevel >= 100
AND 
    crm_margincall.crm_account_id NOT IN 
    (
    SELECT 
        x.crm_account_id 
    FROM 
        crm_margincall x 
    WHERE 
        x.crm_account_id = crm_margincall.crm_account_id 
    AND 
        x.name = 'LevelDrop' 
    AND 
        x.MarginCallLevel < 100 
    AND 
        x.id > crm_margincall.id
    )
ORDER BY 
    id
DESC

在~22.500记录的表上,这个查询需要>10秒才能运行,这是由于子查询定义了NOT IN部分(尝试不存在,速度不会更快)。我怎样才能加入这张桌子来达到同样的效果呢?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-16 10:06:55

在~22.500记录的表上,这个查询需要>10秒才能运行,这是由于子查询定义了NOT IN部分(尝试不存在,速度不会更快)。我怎样才能加入这张桌子来达到同样的效果呢?

这可以通过几种方式完成,但是扫描22500条记录需要10“意味着要么是硬件问题,要么是非常低效率的连接。

后者最有可能的原因是缺少索引或配置不当的索引,要对此进行调查,您需要发出解释:

代码语言:javascript
复制
EXPLAIN SELECT ...

完全在黑暗中拍摄,从所选的柱子上判断,我会尝试

代码语言:javascript
复制
 CREATE INDEX test_index ON crm_margincall(name, crm_account_id, MarginCallLevel, id)

其他改进可能是可能的,但是您需要在SQLfiddle中准备一个包含一些假数据的样例结构,才能真正地进行调试。

票数 1
EN

Stack Overflow用户

发布于 2016-12-15 15:45:30

试着做这样的事情:

代码语言:javascript
复制
    SELECT
    crm_margincall.id,
    crm_margincall.CreationTime,
    ba.name AS crm_bankaccount_id,
    crm_margincall.name,
    crm_margincall.MarginCallLevel,
    crm_margincall.UseOfEquityForMargin,
    crm_margincall.MarginRequired,
    crm_margincall.NetEquityForMargin,
    crm_margincall.MarginDeficit,
    crm_margincall.balance,
    crm_margincall.deposited,
    crm_margincall.prefunded,
    crm_margincall.required
FROM 
    crm_margincall
LEFT JOIN
    crm_bankaccount ba ON crm_margincall.crm_bankaccount_id = ba.id
INNER JOIN 
(
    SELECT 
        x.crm_account_id 
    FROM 
        crm_margincall x 
    WHERE 
        x.name = 'LevelDrop' 
    AND 
        x.MarginCallLevel < 100 
    AND 
        x.id > crm_margincall.id
    ) tt ON crm_margincall.crm_account_id = tt.crm_account_id 
WHERE 
    crm_margincall.name = 'MarginCall' 
AND 
    crm_margincall.MarginCallLevel >= 100

ORDER BY 
    id
DESC
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41167575

复制
相关文章

相似问题

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