MySQL WHERE NOT EXISTS失效且查询卡顿问题求助
优化你的足球赛事数据查询性能
嘿,我来帮你搞定这个卡顿的查询问题~其实你的数据量并不大,卡顿的核心原因大概率是缺少合适的索引,导致数据库不得不反复做全表扫描,拖慢了执行速度。下面是具体的优化方案:
第一步:先给表加上关键索引
这是最见效的优化,直接解决全表扫描的问题:
- 给
st_grid建联合索引:
你的查询先过滤CREATE INDEX idx_st_grid_league_id_id ON st_grid(league_id, id);league_id='15',再用id关联,这个联合索引能让数据库快速定位到目标行,不用扫完整的17万行。 - 给
inplay_fixture_compiled的grid_id建索引:
子查询里用CREATE INDEX idx_inplay_grid_id ON inplay_fixture_compiled(grid_id);grid_id做关联,有了索引后,数据库不用每次都扫1万行的全表,关联速度会快很多。
第二步:换一种查询写法(可选,适配部分数据库优化逻辑)
有些数据库对LEFT JOIN + IS NULL的优化比NOT EXISTS更友好,你可以试试这个替代写法:
SELECT g.id FROM st_grid g LEFT JOIN inplay_fixture_compiled i ON g.id = i.grid_id WHERE g.league_id = '15' AND i.grid_id IS NULL;
如果确定inplay_fixture_compiled.grid_id没有NULL值,也可以用NOT IN(注意:如果有NULL,NOT IN会返回空结果,要谨慎用):
SELECT g.id FROM st_grid g WHERE g.league_id = '15' AND g.id NOT IN (SELECT i.grid_id FROM inplay_fixture_compiled i);
第三步:用执行计划验证优化效果
你可以用EXPLAIN命令查看查询的执行逻辑,确认索引是否生效:
EXPLAIN SELECT g.id FROM st_grid g WHERE NOT EXISTS (SELECT i.grid_id FROM inplay_fixture_compiled i WHERE g.id = i.grid_id) AND g.league_id = '15';
如果输出里的type列显示ALL,说明还是在做全表扫描,得检查索引是否正确创建,或者有没有其他过滤条件干扰了索引的使用。
内容的提问来源于stack exchange,提问作者The Footsie
相关产品推荐
相关产品推荐

