mysql IN 可否使用 EXISTS 替代,求提示

一开始的语句是这样的

SELECT
    a.*, b. NAME AS store_name
FROM
    order a
LEFT JOIN store b ON a.store_id = b.id
WHERE
    a.wid IN (
        100020109, 100020114, 100020112, 100020133, 100020131, 100020143, 100020145, 100020145, 100020147, 100020149, 100020155, 100020170, ...... ,100020407
    )
AND a.channel = 1
AND a.created_at >= '2019-03-01'
AND a.created_at < '2019-03-02'
AND a.is_pay = 1
AND a.type IN (2, 3)
ORDER BY
    a.id DESC

解释后是这样的

clipboard.png

SELECT
    a.*, b. NAME AS store_name
FROM
    order a
LEFT JOIN store b ON a.store_id = b.id
WHERE
    EXISTS (
        SELECT
            c.wid
        FROM
            `tree` c
        WHERE
            c.deleted_at IS NULL
        AND c.first_agent_id = 207
        AND a.wid = c.wid
    )
AND a.channel = 1
AND a.created_at >= '2019-03-01'
AND a.created_at < '2019-03-02'
AND a.is_pay = 1
AND a.type IN (2, 3)
ORDER BY
    a.id DESC
LIMIT 0,
 20

clipboard.png

并没有一点效果!!!

以下来自网络:

一直以来认为exists比in效率高的说法是不准确的。

如果查询的两个表大小相当,那么用in和exists差别不大。

如果两个表中一个较小,一个是大表,则子查询表大的用exists,子查询表小的用in:

例如:表A(小表),表B(大表) 
1: 
select * from A where cc in (select cc from B) 
效率低,用到了A表上cc列的索引; 
select * from A where exists(select cc from B where cc=A.cc) 
效率高,用到了B表上cc列的索引。

相反的 
2: 
select * from B where cc in (select cc from A) 
效率高,用到了B表上cc列的索引; 
select * from B where exists(select cc from A where cc=B.cc) 
效率低,用到了A表上cc列的索引。

https://blog.csdn.net/shooke/article/details/52605232

阅读 4k
4 个回答

现在的解决办法是
AND a.channel = 1 修改为 AND a.channel > 0 AND a.channel < 2

图片描述

exists 我之前是习惯 一条sql 解决,而 in 需要分2条 第一查出in 里面的数据再拼接 sql

,我觉得用explain 分析下 的 都是具体情况 具体分析的,不同表结构 ,索引 ,数据总量不同 确实会得出不同 结果

就你上面的你段SQL explain来看,in的效率应该要高于下面的exists;
之前好像有听说in里面的数据达到一定值,in的效率会下降不少。

你自己尝试下用EXPLAIN试试,把IN 转换为Exists,慢慢试试就这道理。 Mysql开发多用EXplain,这是一种美德。
使用Explain优化SQL.一般会有以下的以下参数:
id 表示查询的序号,有子查询的话,id越大,越先执行。
simple、primary、suquery 表示该查询是否有子查询。
type 这一列非常重要,表示你这个查询是否使用索引, ALL 表示使用全部扫描,性能非常差,
ALL index range ref eq_ref const system null 依次性能从差到好。
其它的看资料: https://blog.csdn.net/ypp91zr...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏