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
Moderador: Moderadores
- JoséQuintas
- Administrador

- Mensagens: 20267
- Registrado em: 26 Fev 2007 11:59
- Localização: São Paulo-SP
Mysql: consulta lenta
Já esqueceu ?cjp escreveu:Mas segue uma dúvida: o DELETE usa índices? Porque a questão neste post é para um comando DELETE.
Não lembra quando começou a usar índices ?
Começou justamente porque não estava nem conseguindo excluir.
José M. C. Quintas
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Harbour 3.2, mingw, gtwvg mt, fivewin 25.04, multithread, dbfcdx, MySQL, ADOClass, PDFClass, SefazClass, (hwgui mt), (hmg3), (hmg extended), (oohg), PNotepad, ASP, stored procedure, stored function, Linux (Flagship/harbour 3.2)
"The world is full of kings and queens, who blind our eyes and steal our dreams Its Heaven and Hell"
https://github.com/JoseQuintas/
Mysql: consulta lenta
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.
Quando você usa WHERE o motor do bando de dados usa o índice para localizar a informação.
010011110010000001110011011101010110001101100101011100110111001101101111001000001110100100100000011000110110111101101110011100110111010001110010011101011110110101100100011011110010000001100001001000000110111001101111011010010111010001100101
01001101011000010111001001100011011011110111001100100000010000010110111001110100011011110110111001101001011011110010000001000100011001010010000001000010011011110110111001101001
0101010001100101011011000011101000100000001010000011001000110111001010010011100100101101001110010011100000110100001100110010110100110101001100100011100100110000
01001101011000010111001001100011011011110111001100100000010000010110111001110100011011110110111001101001011011110010000001000100011001010010000001000010011011110110111001101001
0101010001100101011011000011101000100000001010000011001000110111001010010011100100101101001110010011100000110100001100110010110100110101001100100011100100110000
Mysql: consulta lenta
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:
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.
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.
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
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;
Como é raro meus cliente usar informações com mais de 1 ano e 3 messes, para estatística, o arquivamento funcionou bem para mim.
010011110010000001110011011101010110001101100101011100110111001101101111001000001110100100100000011000110110111101101110011100110111010001110010011101011110110101100100011011110010000001100001001000000110111001101111011010010111010001100101
01001101011000010111001001100011011011110111001100100000010000010110111001110100011011110110111001101001011011110010000001000100011001010010000001000010011011110110111001101001
0101010001100101011011000011101000100000001010000011001000110111001010010011100100101101001110010011100000110100001100110010110100110101001100100011100100110000
01001101011000010111001001100011011011110111001100100000010000010110111001110100011011110110111001101001011011110010000001000100011001010010000001000010011011110110111001101001
0101010001100101011011000011101000100000001010000011001000110111001010010011100100101101001110010011100000110100001100110010110100110101001100100011100100110000

