在mysql中不使用NOT EXISTS寻找更好的查询

时间:2016-08-24 14:06:23

标签: mysql not-exists

我的应用程序有一些架子经常进行审核。我必须找出目前审计中尚未添加的货架。 架构如下所示

shelf : [id,code,status,...]
shelf_audit: [id,sub_audit_id,shelf_id,...]
sub_audit : [id,audit_id,status,..]
audit : [id,status]

特定审计中有多个sub_audit,shelf_audit表示添加到sub_audit的货架。 我可以使用以下查询将未添加到当前审核中的货架

select distinct s.code
from shelf s
where not exists
(
    select distinct sa.shelf_id
    from shelf_audit sa
    join sub_audit scc
        on (sa.sub_audit_id = scc.id
    and scc.audit_id = @currentAuditId)   
    where sa.shelf_id = s.id
) and s.status='ACTIVE' ;

我想在不使用 NOT EXISTS 的情况下这样做,因为它在mysql数据库中的性能非常差。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

没有充分考虑子查询...这样简单吗?

<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/themes/default/style.min.css"/>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/1.12.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.2.1/jstree.min.js"></script>


<label form="search">Products: </label>
<input type="text" value="" id="search" placeholder="Search products">
<div id="divPanel">
    <button id="btnCheckAll">Check All</button><button id="btnUnCheckAll">UnCheck All</button><button id="btnClose">Close</button>
    <div id="data">

        <ul>
            <li>Root node 1
                <ul>
                    <li id="child_node_1">Child node 1</li>
                    <li>Child node 2</li>
                </ul>
            </li>
            <li>Root node 2</li>
        </ul>
    </div>
</div>

答案 1 :(得分:0)

临时表可以如下使用以提高性能

select distinct sa.shelf_id
into #temp
from shelf_audit sa
join sub_audit scc
    on (sa.sub_audit_id = scc.id
and scc.audit_id = @currentAuditId)   

select distinct code from shelf s where status='ACTIVE' and
not exists (select top 1 * from #temp where shelf_id = s.id)

希望有所帮助