Ir para conteúdo

POWERED BY:

Arquivado

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

bcs_ptx

Consultas com index

Recommended Posts

Pessoal, sempre fiz meus bancos, com relacionamentos e nunca usei index nem nada, mas agora o site acusou de query lenta, eu coloquei index para cada id que entra de outras tabelas, está certo desse modo ou não? por que a velocidade da consulta não mudou.

 

CREATE TABLE `avaliacao` (
 `id` int(10) NOT NULL AUTO_INCREMENT,
 `id_usuario` int(10) DEFAULT NULL,
 `data_cadastrada` date DEFAULT NULL,
 `area` varchar(10) DEFAULT NULL,
 `atividade` varchar(50) DEFAULT NULL,
 `cliente` int(10) DEFAULT NULL,
 `local` varchar(50) DEFAULT NULL,
 `paciente` varchar(50) DEFAULT NULL,
 `medicos` int(10) DEFAULT NULL,
 `data_implante` date DEFAULT NULL,
 `data_avaliacao` date DEFAULT NULL,
 `hora` time DEFAULT NULL,
 `tecnico` varchar(30) DEFAULT NULL,
 `observacao` varchar(500) DEFAULT NULL,
 `convenio` varchar(50) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `index2` (`id_usuario`),
 KEY `index3` (`cliente`),
 KEY `index4` (`medicos`)
) ENGINE=MyISAM AUTO_INCREMENT=2443 DEFAULT CHARSET=latin1$$

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde amigo,

 

Você tá usando ORDER BY na consulta? Ordenar pelo índice é o objetivo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

cara a consulta que mostrou lentidão foi essa

 

SELECT * , DATE_FORMAT( data_avaliacao,  '%d/%m/%Y' ) AS data_avaliacao2, avaliacao.id FROM avaliacao WHERE id >0 AND tecnico =  'Fabio'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Use um ORDER BY amigo, pra ordenar os resultados pelo índice desejado.

 

Outra coisa, você criou chaves e não índices. Veja esse link que tem umas informações bem resumidas e claras:

 

http://www.nviana.eng.br/wp/sql/como-criar-indice-index-no-sql-server-e-mysql

 

Fico a disposição =]

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, na verdade são chaves, para dizer que estou chamando aqueles dados de uma outra tabela, para buscar mais rapido, esta correto como eu fiz? abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pra usar a chave estrangeira a Engine da tabela precisa ser InnoDB.

 

Ficaria dessa forma um exemplo:

 

CREATE TABLE `avaliacao` (
 `id` int(10) NOT NULL AUTO_INCREMENT,
 `id_usuario` int(10) DEFAULT NULL,
 `data_cadastrada` date DEFAULT NULL,
 `area` varchar(10) DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `index2` (`id_usuario`),
 CONSTRAINT `usuario_fk_1` FOREIGN KEY (`id_usuario`) REFERENCES `usuario` (`id`)
) ENGINE=InnoDB

Note o CONTRAINT, que diz que o campo id_usuario na tabela atual faz referência ao campos id na tabela usuario.

 

Veja este artigo que aponta as diferenças entre InnoDB e MyISAM:

 

http://www.oficinadanet.com.br/artigo/789/mysql_-_diferenca_entre_innodb_e_myisam

 

Qualquer coisa pesquise mais sobre InnoDB e chaves estrangeiras.

 

Espero que ajude, abraços.

Compartilhar este post


Link para o post
Compartilhar em outros sites

É bom lembrar que nem sempre usar um índice torna uma query mais rápida, em certas condições pode tornar bem mais lenta.

Compartilhar este post


Link para o post
Compartilhar em outros sites
SELECT * , DATE_FORMAT( data_avaliacao,  '%d/%m/%Y' ) AS data_avaliacao2, avaliacao.id FROM avaliacao WHERE id >0 AND tecnico =  'Fabio'

 

Substitua o asterisco pelas colunas que você realmente irá utilizar. e se possivel mude o

AND tecnico =  'Fabio'

por

AND tecnico LIKE 'Fabio'

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ou

 

SELECT * , DATE_FORMAT( data_avaliacao,  '%d/%m/%Y' ) AS data_avaliacao2, avaliacao.id 
FROM avaliacao 
WHERE tecnico like 'Fabio%'

 

o

WHERE id >0

PODE estar fazendo o BD realizar a busca pelo índice, que na caso PODE ficar mais lenta.

 

Só rodando o Plano de Execução para as duas queries para ver.

 

O condicional se deve ao fato que a performance depende de N fatores.

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.