Página 6 de 6

Mysql: consulta lenta

Enviado: 15 Dez 2024 00:12
por cjp
Agradeço os esclarecimentos, muito úteis.
Refiz os índices, conforme tua explicação.
Mas segue uma dúvida: o DELETE usa índices? Porque a questão neste post é para um comando DELETE.

Mysql: consulta lenta

Enviado: 15 Dez 2024 01:33
por JoséQuintas
cjp escreveu:Mas segue uma dúvida: o DELETE usa índices? Porque a questão neste post é para um comando DELETE.
Já esqueceu ?
Não lembra quando começou a usar índices ?
Começou justamente porque não estava nem conseguindo excluir.

Mysql: consulta lenta

Enviado: 15 Dez 2024 09:16
por dbsh
Quando você faz uma operação que altera a informação no banco de dado, (INSERT/UPDATE/DELETE), os índices tem que ser atualizado.
Quando você usa WHERE o motor do bando de dados usa o índice para localizar a informação.

Mysql: consulta lenta

Enviado: 15 Dez 2024 11:47
por dbsh
Quanto menos informação o banco de dado tem para manipular, mais rápido vai ser o processo.

CASO DE USO MEU:
Quando o banco de dado tem mais de 1 milhão de linhas e tem mais de 1 ano e meio desde o ultimo arquivamento, transfiro a informação para uma tabela auxiliar, guardo a informação do ultimo arquivamento.

Quando o operador seleciona a data inicial menor que a data de arquivamento, automaticamente a opção de arquivamento é selecionada, deixando a opção para o operador desativar, no começo deu muito trabalho, hoje é automático quando vou fazer um relatório novo, implemento deste jeito.

EX:

Código: Selecionar todos

sSQL := "selet * from venda_detalhe where ..."
IF DtInicial <= DtArquivo
  //repito a query e só troco `venda_detalhe` por `venda_detalhe_a`
  sSql += ' union all ' +  Strtran(sSQL, "venda_detalhe", "venda_detalhe_a")
ENDIF
Uso a nomenclatura `tabela_original_a`.
Exemplo de uso com duas tabelas, unido a informação como um todo, 5 estatística de venda, na mesma query.

Código: Selecionar todos

SELECT p0.id_produto, COUNT(*) AS QuantidadeItemVendido, SUM(p0.quantidade) AS TotalVendido, MIN(p0.quantidade) AS MenorQtdVendida, MAX(p0.quantidade) AS MaiorQtdVendida, FORMAT(AVG(p0.quantidade), 3) MediaDeVenda
FROM (
	SELECT p1.id_produto, p1.quantidade  FROM venda_detalhe p1 WHERE p1.data_venda <= '2022-01-01'
	UNION ALL
	SELECT p2.id_produto, p2.quantidade FROM venda_detalhe_a p2 WHERE p2.data_venda <= '2022-01-01'
) p0
GROUP BY p0.id_produto;
Você pode usar também particionamento.
Como é raro meus cliente usar informações com mais de 1 ano e 3 messes, para estatística, o arquivamento funcionou bem para mim.