mysql - sql查询性能低
问题描述
我想优化我的 sql 查询。当我在Investors_diversificacao表中放入大量数据时,它会变得非常慢并且无法加载。但是由于investors_diversificacao表中的数据很少,它可以加载数据。
我想帮助优化查询响应时间。
sql查询:
SELECT investors_positivador.cod_cliente, investors_saldo_financeiro.nome_cliente, investors_base_assessores.squad, investors_base_assessores.nome_investor, investors_saldo_financeiro.saldo_d0,
SUM(CASE WHEN investors_posicao_geral.vencimento <= @vencimento THEN investors_posicao_geral.financeiro ELSE 0 END) AS vencimentos_ate_data,
ROUND(SUM(CASE WHEN investors_diversificacao.produto = 'Fundos' THEN investors_diversificacao.net / 6 ELSE 0 END), 2) AS fundos_ate_data, investors_guia_fundos.liquidez_total, investors_positivador.contatar_liquidity_map,
investors_positivador.id, investors_posicao_geral.vencimento, investors_base_assessores.nome_assessor
FROM investors_positivador
INNER JOIN investors_saldo_financeiro ON cod_cliente = investors_saldo_financeiro.cod_cliente
INNER JOIN investors_base_assessores ON cod_assessor = investors_base_assessores.cod_assessor
INNER JOIN investors_posicao_geral ON investors_positivador.cod_cliente = investors_posicao_geral.cod_cliente
LEFT OUTER JOIN investors_diversificacao ON investors_positivador.cod_cliente = investors_diversificacao.cod_cliente
LEFT OUTER JOIN investors_guia_fundos ON investors_diversificacao.cnpj = investors_guia_fundos.cnpj
WHERE (investors_base_assessores.nome_investor = @investor_nome) AND (investors_saldo_financeiro.saldo_d0 > 0)
OR (investors_base_assessores.nome_investor = @investor_nome) AND (investors_posicao_geral.financeiro > 0)
OR (investors_base_assessores.nome_investor = @investor_nome) AND (investors_diversificacao.net > 0)
GROUP BY investors_positivador.cod_cliente
解决方案
其中一些索引可能会有所帮助:
investors_positivador: INDEX(cod_cliente, contatar_liquidity_map, id)
investors_saldo_financeiro: INDEX(cod_cliente, saldo_d0, nome_cliente)
investors_base_assessores: INDEX(nome_investor, cod_assessor, squad, nome_assessor)
investors_posicao_geral: INDEX(cod_cliente, financeiro, vencimento)
investors_diversificacao: INDEX(cod_cliente, net, produto, cnpj)
investors_guia_fundos: INDEX(cnpj, liquidez_total)
你确定要那个WHERE
子句吗?所有这些ORs
都无关紧要,Riggs 的版本简化为
WHERE investors_base_assessores.nome_investor = @investor_nome
AND investors_diversificacao.net > 0
求和前不要四舍五入;你会得到额外的舍入错误:
ROUND(SUM(IF(investors_diversificacao.produto = 'Fundos',
investors_diversificacao.net, 0
)
) / 6 -- divide after summing and before rounding
, 2) AS fundos_ate_data
推荐阅读
- javascript - 使用节点 js 在 MySQL 字段中插入值
- reactjs - 使用带有 URL 对象的 Next.js 路由器推送时出现意外行为
- c - 将随机梯度下降转换为小批量梯度下降
- django-views - 使用视图中的一对多相关字段迭代查询集
- oracle11g - oracle 11g 中的并行性
- spring-boot - 从源“http://localhost:4200”访问“http://localhost:8080/api/auth/userdetails”的 XMLHttpRequest 已被 CORS 策略阻止
- nginx - Nginx rewrite 覆盖索引
- flutter - 如何在streambuilder中设置状态
- powerbi - 可以将交互式 Power BI 报表嵌入到电子邮件中吗?
- python - 气流 - 更改单个任务颜色