Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Boa tarde Senhores, tenho uma base de dados com enormes quantidades de registros e sem possibilidade de indexação, pois as mesmas são advindas de relatórios externos. Porem preciso cruzar os dados para gerar um novo relatório, portanto minha consulta esta ficando muito lenta. Gostaria de idéias que possa me ajudar neste caso.
Segue o Código da consulta simples:
SELECT
m.Nome,
m.Endereco,
m.Numero,
m.Cep,
m.Bairro,
m.Documento,
m.DDD,
m.TelefoneNumero,
g.ARMARIO,
t.Operadora
FROM
mailing as m,
geovendas as g,
telefone as t
Where
m.Numero=g.Numero And
m.Cep=g.Cep_esq And
concat(m.DDD,m.TelefoneNumero) = t.Telefone
mailing tem certa de 250.000 registros
geovendas tem cerca de 800.000 registros
telefone tem cerca de 1.200.000 registros
Preciso listar novamente os dados da tabela mailing retornando apenas os dados que coincidem com o numero e o cep da tabela geovendas e também informar a operado do telefone que consta na tabela telefone.
Desde já agradeço.
Realmente o concat esta retardando o processo.
Estes dados vem em formato .csv, então importo eles para o mysql, que neste caso nenhum dos campos definidos não posso definir como index, pois os telefones das tabelas podem repetir e não formam um padrão. Pois a tabela principal que é mailing ja vem com DDD e telefone separado, e na tabela geovendas não tem telefone para vincular.
Segue o objetivo principal para melhor compreensão.
a tabela mailing consta os contatos da empresa, e a tabela geovendas é os locais onde a operadora atua, então preciso listas somente os dados da tabela mailing que coincide com o número e o cep da tabela geovendas, que é os endereços de atuação da empresa. A tabela telefone é somente para informar a operado do telefone.
Agradeço a atenção.
Detalhe, preciso gerar este relatório ainda como .csv rsrs
Um índice não precisa ser único pode ter duplicidade sendo usado apenas para otimizar
Tente
criar este indice (não únicos)
mailing (Numero,Cep_esq,telefone)
geovendas (Numero,Cep_esq)
telefone(telefone)
trocar q sql para
...
geovendas as g,
telefone as t
Where
m.Numero=g.Numero And
m.Cep=g.Cep_esq And
t.Telefone = concat(m.DDD,m.TelefoneNumero)
Motta, vou fazer as alterações, posto o resultado depois.
Obrigado por enquanto.
Motta, simplesmente a consulta ficou super rápida, não tem nem base para comparar, só tenho a agradecer pelo ensinamento.
Mas me tire outra dúvida possível.
Existe a possibilidade de:
campo 1: DDD
campo 2: Telefone
campo 3: default value = concat(DDD,Telefone)
Este esta possibilidade de o MySql ja interpretar este terceiro campo?
Fico agradecido.
Existe um troço chamado coluna virtual (virtual column) , que é calculado ou concatenado , não se como (e se) o Mysql implementa.
1) Este tipo de construção
concat(m.DDD,m.TelefoneNumero) = t.Telefone
em geral degrada as pesquisas
2) Pq o fato de advir de uma fonte de dados externa impede a indexação !?