MySQL漏加索引
犯了傻逼的错误,感觉自己真该!
NOT IN优化成NOT EXISTS后性能提升了10%,部署新服务器数据量积累到一定数量后发现总有问题:80w数据量的大表(cookie_clean_t)关联不到1w数据量的临时表(cookie_short_run_t)提供的接口很大一部分请求打印的耗时达到4s甚至5s以上,请求设置的3s超时很被动了!当时第一反应也是查看索引,看了几遍都确认索引创建正常,最后百度需求解决方案优化NOT EXISTS,当时找到的是LEFT JOIN设计,最后测试发现性能更差。
二次优化的SQL语句如下:
EXPLAIN
SELECT * FROM cookie_clean_t cc
LEFT JOIN cookie_short_run_t csr ON cc.uuid=csr.uuid
WHERE cc.state=0 AND csr.uuid IS NULL
ORDER BY cc.uuid DESC LIMIT 50
EXPLAIN
SELECT * FROM cookie_clean_t cc
WHERE NOT EXISTS(SELECT csr.uuid FROM cookie_short_run_t csr WHERE csr.uuid=cc.uuid)
AND cc.state=0
ORDER BY cc.uuid DESC LIMIT 50
由于表关联处理的业务逻辑比较多,当时还考虑到临时表批量更新大表状态影响了优化的SQL语句,排除了所有可能,最后再次确认索引发现cookie_short_run_t的字段uuid没有创建索引,加上后性能提升55%。
又是为自己的大意买单,猪脑袋真活该!