You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:52:11