不使用in语句重新设计查询

uttx8gqw  于 2021-06-15  发布在  Mysql
关注(0)|答案(3)|浏览(261)

我有如下疑问。这个查询运行得很好,但是因为我有大量的数据要检查,所以这个查询运行得比较慢。
有人能帮我优化这个查询吗?

SELECT * from trn where concat(comp_id,cus_id) 
IN (select concat(comp_id,cus_id) FROM cus where sid='A0001') 
AND docdate between ('2018-01-01') and ('2018-04-30')
jei2mxaa

jei2mxaa1#

你可以用 EXISTS :

SELECT t.*
FROM trn t
WHERE EXISTS (SELECT 1 
              FROM cus c 
              WHERE c.sid = 'A0001' AND c.comp_id = t.comp_id AND c.cus_id = t.cus_id
             ) AND
      docdate between '2018-01-01' and '2018-04-30';
zrfyljdw

zrfyljdw2#

你可以用 JOIN ,例如:

SELECT DISTINCT t.*
FROM trn t 
JOIN cus c ON t.comp_id = c.comp_id AND t.cus_id = c.cus_id
WHERE c.sid='A0001' AND t.docdate BETWEEN ('2018-01-01') AND ('2018-04-30');
aydmsdu9

aydmsdu93#

这个 concat 可能是因为它不能使用索引而导致性能问题。
但是mysql支持多列子查询,所以只需删除它:

SELECT * from trn 
where (comp_id,cus_id) IN 
        ( select comp_id,cus_id
          FROM cus 
          where sid='A0001'
        ) 
  AND docdate between ('2018-01-01') and ('2018-04-30')

相关问题