SELECT DISTINCT s.advertId
as id
, s.exchangeId
FROM advert_status
s
JOIN advert a ON s.advertId = a.id
JOIN material m ON m.creativeId = a.creativeId
JOIN customer_exchange c ON a.customerId = c.customerId AND s.exchangeId = c.exchangeId
WHERE c.status
= 1
AND ((s.exchangeId
IN (1, 3, 5, 7, 8, 9, 10, 17, 23, 25, 29, 34, 38) AND c.exchangeStatus
= 2)
OR (s.exchangeId
IN (1, 5) AND c.exchangeStatus
= 4)
OR s.exchangeId
IN (2, 4, 6, 13, 14, 15, 20, 21, 27, 28, 30, 31, 32, 35, 37))
AND s.advertId
IS NOT NULL AND s.exchangeId
IS NOT NULL
AND s.status_exchange
= 1
AND s.status_yoyi
= 2
AND a.status
IN(1, 2)
AND m.uploadedFlag
= 2
LIMIT 300;
第一,确保join中On关联的字段有索引。
第二,s.exchangeid in 这个是不可能走索引的, 所以可以改成fun(s.exchageid) =1,这种定义函数的写法,定义函数,当传入俄日12378等等的时候返回1,
另外的情况返回二,而在s.excangeid 中直接把这个函数创建为索引。
第三,mysql在没有做分布式的情况下,如果你的表数据量很大,非常不推荐写这种sql.
第四,或者采用给某个表增加列的方式,用于存储原来用In判断的逻辑范围,把In转化为新字段的=判断。