bcs_ptx 0 Denunciar post Postado Agosto 29, 2012 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
DiegoAngra07 21 Denunciar post Postado Agosto 29, 2012 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
bcs_ptx 0 Denunciar post Postado Agosto 29, 2012 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
DiegoAngra07 21 Denunciar post Postado Agosto 29, 2012 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
bcs_ptx 0 Denunciar post Postado Agosto 29, 2012 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
DiegoAngra07 21 Denunciar post Postado Agosto 29, 2012 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
Motta 645 Denunciar post Postado Agosto 30, 2012 É 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
marcoscgr 0 Denunciar post Postado Agosto 31, 2012 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
Motta 645 Denunciar post Postado Agosto 31, 2012 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