Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

ericmaicon

Melhorando meu SQL?

Recommended Posts

Olá galera, bom dia!

 

estou com alguns SQL's feito por mim no qual tem uns 2 LEFT JOIN entre 3 tables...cada table deve ter alguns 15mil registros..e isso está pesando meu sistema!!

 

como eu nunca fiz curso de SQL..vivo apanhando e aprendendo eu não sei se está bom o meu SQL...queria q você visse o fonte:

 

CREATE TABLE `contatos` (
  `co_id` int(11) NOT NULL auto_increment,
  `co_nome` varchar(40) collate latin1_general_ci NOT NULL default '',
  `co_sobrenome` varchar(80) collate latin1_general_ci NOT NULL default '',
  `co_nascimento` date default NULL,
  `co_notas` text collate latin1_general_ci,
  PRIMARY KEY  (`co_id`)
)

CREATE TABLE `contatos_email` (
  `em_id` int(11) NOT NULL auto_increment,
  `em_contato` int(11) NOT NULL default '0',
  `em_email` varchar(100) collate latin1_general_ci default NULL,
  PRIMARY KEY  (`em_id`),
  KEY `FK_nome_fk` (`em_contato`)
)

CREATE TABLE `contatos_grupos` (
  `id` int(11) NOT NULL auto_increment,
  `id_cont` int(11) NOT NULL default '0',
  `id_grupo` tinyint(4) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `FK_nome_fk` (`id_cont`),
  KEY `FK_grupo_fk` (`id_grupo`)
)

CREATE TABLE `contatos_endereco` (
  `en_id` int(11) NOT NULL auto_increment,
  `contatos_id` int(11) NOT NULL,
  `en_tipo` varchar(20) collate latin1_general_ci NOT NULL default '',
  `en_endereco` varchar(100) collate latin1_general_ci default NULL,
  `en_setor` varchar(100) collate latin1_general_ci default NULL,
  `en_cidade` varchar(50) collate latin1_general_ci default NULL,
  `en_estado` varchar(10) collate latin1_general_ci default NULL,
  `en_cep` varchar(20) collate latin1_general_ci default NULL,
  `en_pais` char(20) collate latin1_general_ci default NULL,
  `en_telefone` varchar(20) collate latin1_general_ci default NULL,
  `en_telefone2` varchar(20) collate latin1_general_ci default NULL,
  PRIMARY KEY  (`en_id`),
  KEY `FK_nome_fk` (`contatos_id`)
)

meu sql:

 

SELECT contatos.co_id, contatos.co_nome, contatos.co_sobrenome
						FROM contatos
						LEFT JOIN contatos_endereco ON co_id = contatos_id
						LEFT JOIN contatos_grupos ON id_cont = co_id
						WHERE en_endereco IS NULL
						AND id_grupo = '1'
						ORDER BY  contatos.co_id DESC
						LIMIT 0, 50

o sistema trava!

EAHEAhAEHeaheahae

 

alguém me ajuda nessa por favor? obrigado!!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Os dados que você quer buscar tem que existir nas 3 tabelas ao mesmo tempo? Se sim, melhor usar o inner join que o left join. O inner só pegará registros que existam nas 3 tabelas ao mesmo tempo. Isso pode ajudar um pouco...

 

De resto, seria melhor indexar as bases de dados e pensar em montar mais restrições de pesquisa pra filtrar melhor os dados...

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

bom...não necessariamente...ele pode ter um contato sem endereço (que não envolva a tabela contato_endereço)...

 

e pensar em montar mais restrições de pesquisa pra filtrar melhor os dados...

ai eh q tá..já tem 4 restrições, porém vai do usuário usá-la ou não!!

 

vou indexar e trocar pra inner pra ver o oque ocorre eposto aqui!!

obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Eh simples, todos os pontos de junçao devem ter chave ou indice, bem como todos os where e o order by epuxar estritamente o necessario no select

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.