gpt4 book ai didi

mysql - 程序更新记录慢

转载 作者:行者123 更新时间:2023-11-29 15:32:11 24 4
gpt4 key购买 nike

如何改进程序以使其执行速度更快?我有 3 个程序,第一个程序在第二个程序更新余额之前搜索余额,第三个程序用于进行处理,其中我调用前两个程序。简而言之,当我插入表记录时,服务中的计时器通过调用过程 PROC_PROCESSAR_SALDO 重做余额处理。

DROP PROCEDURE IF EXISTS `PROC_SALDO_ANTERIOR`;

DELIMITER $$

CREATE PROCEDURE `PROC_SALDO_ANTERIOR` (
IN codigo_Empresa_par INT,
IN codigo_Filial_par INT,
IN codigo_Conta_par INT,
IN sequencia_par BIGINT(20),
IN data_Hora_par DATETIME,
OUT sequencia_ret BIGINT(20),
OUT data_Hora_ret DATETIME,
OUT saldo_Atual_ret DECIMAL(20, 2)
)
BEGIN

SELECT SEQUENCIA, DATAHORA, SALDO_ATUAL INTO sequencia_ret, data_Hora_ret, saldo_Atual_ret
FROM CONTAS_CORRENTES
WHERE CODIGO_EMPRESA = codigo_Empresa_par AND
CODIGO_FILIAL = codigo_Filial_par AND
CODIGO_CONTA = codigo_Conta_par AND
((DATAHORA =data_Hora_par AND SEQUENCIA < sequencia_par) OR (DATAHORA < data_Hora_par))
ORDER BY DATAHORA DESC, SEQUENCIA DESC LIMIT 1;

if sequencia_ret IS NULL THEN
SET sequencia_ret := 0;
SET data_Hora_ret := '0001/01/01 12:00:00';
SET saldo_Atual_ret := 0;
END IF;
END;

DELIMITER ;



DROP PROCEDURE IF EXISTS `PROC_ATUALIZAR_SALDO`;

DELIMITER $$



CREATE PROCEDURE `PROC_ATUALIZAR_SALDO` (
IN codigo_Empresa_par INT,
IN codigo_Filial_par INT,
IN codigo_Conta_par INT,
IN sequencia_par BIGINT(20),
IN data_Hora_par DATETIME,
IN saldo_Atual_par DECIMAL(20,2)
)
BEGIN
DECLARE SEQUENCIA_NEW BIGINT(20) DEFAULT 0;
DECLARE DEBITO_NEW DECIMAL(20,2) DEFAULT 0;
DECLARE CREDITO_NEW DECIMAL(20,2) DEFAULT 0;
DECLARE SALDO_ANTERIOR DECIMAL(20,2) DEFAULT 0;
DECLARE done INT DEFAULT FALSE;
DECLARE cur CURSOR FOR SELECT A.SEQUENCIA, A.DEBITO, A.CREDITO
FROM CONTAS_CORRENTES A
WHERE A.CODIGO_EMPRESA = codigo_Empresa_par AND
A.CODIGO_FILIAL = codigo_Filial_par AND
A.CODIGO_CONTA = codigo_Conta_par AND
((A.DATAHORA = data_Hora_par AND
A.SEQUENCIA > sequencia_par) OR
(A.DATAHORA > data_Hora_par))
ORDER BY A.DATAHORA ASC,
A.SEQUENCIA ASC;
DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE;

START TRANSACTION;

SET SALDO_ANTERIOR := saldo_Atual_par;


OPEN cur;
ins_loop: LOOP
FETCH cur INTO SEQUENCIA_NEW, DEBITO_NEW, CREDITO_NEW;
IF done THEN
LEAVE ins_loop;
END IF;

SET SALDO_ANTERIOR := SALDO_ANTERIOR - DEBITO_NEW + CREDITO_NEW;

UPDATE CONTAS_CORRENTES SET SALDO_ATUAL = SALDO_ANTERIOR
WHERE CODIGO_EMPRESA = codigo_Empresa_par AND
CODIGO_FILIAL = codigo_Filial_par AND
CODIGO_CONTA = codigo_Conta_par AND
SEQUENCIA = SEQUENCIA_NEW;
END LOOP;
CLOSE cur;

COMMIT;

END $$

DELIMITER ;

DROP PROCEDURE IF EXISTS `PROC_PROCESSAR_SALDO`;

DELIMITER $$

CREATE PROCEDURE `PROC_PROCESSAR_SALDO` (
IN codigo_Empresa_new INT,
IN codigo_Filial_new INT,
IN codigo_Conta_new INT,
IN sequencia_new BIGINT(20),
IN data_Hora_new DATETIME
)
BEGIN

CALL PROC_SALDO_ANTERIOR(codigo_Empresa_new, codigo_Filial_new, codigo_Conta_new, sequencia_new,
data_Hora_new, @sequencia_ret, @data_Hora_ret, @saldo_Atual_ret);

CALL PROC_ATUALIZAR_SALDO(codigo_Empresa_new, codigo_Filial_new, codigo_Conta_new, @sequencia_ret,
@data_Hora_ret, @saldo_Atual_ret);
END $$

DELIMITER ;

CALL PROC_PROCESSAR_SALDO(@CODIGO_EMPRESA, @CODIGO_FILIAL, @CODIGO_CONTA, @SEQUENCIA, @DATAHORA);

最佳答案

您必须检查是什么导致查询变慢。您基本上有两件事需要检查:

  • 各个查询是否使用索引?
  • 游标循环是否会产生如此多的行(可能是稍微未优化的)循环中的查询加起来导致性能下降

使用EXPLAIN检查各个查询的索引使用情况。您还可以在每个查询后面添加 select now() 并执行该过程,您应该会看到哪个部分消耗了时间。

关于mysql - 程序更新记录慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58632232/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com