sql语句优化,最好可以写出优化后的sql

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转化为新字段的=判断。

图片说明意思就是把函数做为一个索引,只有走索引才能让查询速度更快。