数据库CPU占用过高,请求优化指定SQL查询语句
SQL查询CPU占用过高的优化方案
一、先搞定索引(最关键的优化点)
- 主表
mnvb.hjvgf的过滤字段infgrdt必须建覆盖索引,把查询需要的字段都包含进去,避免回表查询:CREATE INDEX idx_hjvgf_infgrdt_cover ON mnvb.hjvgf (infgrdt) INCLUDE (hfg, dfg, hjr, efxd, gefvb); - 关联表的关联字段也要建带覆盖的索引,减少关联时的表扫描:
CREATE INDEX idx_yefg_fgd_cover ON mnvb.yefg (fgd) INCLUDE (ufl); CREATE INDEX idx_fjtn_fgd_cover ON mnvb.fjtn (fgd) INCLUDE (jdnm);
二、查询语句微调
原查询逻辑没问题,但可以强制数据库先过滤主表再关联,避免优化器选错执行顺序(以MySQL为例,PostgreSQL可调整为LEADING(de)):
SELECT de.infgrdt, de.hfg, de.dfg, de.hjr, e.ufl AS exchange, de.efxd, t.jdnm AS prkr FROM mnvb.hjvgf de STRAIGHT_JOIN mnvb.yefg e ON de.efxd = e.fgd STRAIGHT_JOIN mnvb.fjtn t ON de.gefvb = t.fgd WHERE de.infgrdt >= '2022-10-14 00:04:20.000000' AND de.infgrdt < '2022-10-14 03:22:54.000000';
三、必做的检查项
- 跑执行计划:用
EXPLAIN(MySQL)或EXPLAIN ANALYZE(PostgreSQL)查看执行路径,确认索引是否生效,有没有全表扫描的环节。 - 核对关联字段类型:确保
de.efxd和e.fgd、de.gefvb和t.fgd的数据类型完全一致,类型不匹配会直接导致索引失效。 - 评估数据量:如果这个时间范围内的行数特别多,考虑分页查询或者分批处理,别一次性拉取所有数据。
内容的提问来源于stack exchange,提问作者sportyrdy
相关产品推荐
相关产品推荐

