Ir para conteúdo

POWERED BY:

Arquivado

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

Raphael Figa

Melhor forma de armazenar dados (Desempenho)

Recommended Posts

Olá pessoal,

 

Dentro o meu maior medo, na hora de desenvolver um sistema é acontecer o que o tio Bill Gates sofreu quando na apresentação deu tela Azul, e isso pode ocorrer a qualquer momento quando o desempenho do banco não dos melhores, num simples timeout do PHP.

Estava desenhando uma tabela, e espero que este quando estiver em produção tenha em média 50.000 registros que serão consultados todo o tempo, diversas vezes.

 

Um dos dados que precisarei informar é endereço completo, sendo ESTADO / CIDADE / BAIRRO campos INDEX e utilizados o tempo todo como critérios do SELECT.

 

Cada vez que a listagem é chamada, irei imprimir na tela do usuário a CIDADE / BAIRRO, portanto não posso armazenar apenas o ID da cidade ou bairro, e rodar um outro SELECT para cada registro.

 

A minha duvida é a seguinte, qual a melhor forma de armazenar estes dados pensando em desempenho de consulta, economia de memória de servidor.

Pensei nas seguintes opções

 

- Armazenar apenas o ID da cidade, cadastrada em outra tabela

CONTRAS

Cada vez que fosse chamados os registros (em média 10 por página geraria mais dez SELECT na tabela de cidades) perdendo em desempenho

 

- Armazenar o nome completo da cidade

CONTRAS

Pode gerar variações do mesmo dado (Campo CIDADE = São Paulo, Sao Paulo, S. Paulo, SP)

Me disseram que pesquisas por texto demoram mais que por indices numéricos, essa informação confere

 

- Armazenar um ID dessa cidade para relacionar com outra tabela e também o nome completo da cidade para não ter que buscar na outra tabela toda hora

CONTRAS

Dados armazenando informações teoricamente redundantes. (Ex. campos

ID_CIDADE => Para relacionar dados com outra tabela

NOME_CIDADE => Nome da cidade por extenso para ser impresso na tela do usuário sem ter que buscar em outra tabela.

 

Qual dessas opções é o melhor? Alguém sugere outra?

 

Agradeço a todos pela atenção e se puderem ajudar

Ficarei muito grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

você poderia cadastrar tudo na mesma tabela... criando um indice..

duvida a tabela que vai chamar esses dados é outra tabela ??

 

uma maneira de fazer seria ter o literal cidade "nome da cidade", estado "nome do estado", bairro "nome do bairro" criado indices

 

se fosse fazer um editar nesses campos

//pega os registros

select distinct(cidade) from tabela order by cidade asc

 

update

update tabela set cidade = 'nova_cidade' where cidade = 'cidade_antiga' /* so lembrando se você digitar um nome de uma cidade existe irá juntar tudo... */

 

 

ficaria bem rapido e 50.000 registros a consulta com ctz nem ia carregar a página

 

com relação as suas 3 .. a ultima nem pensar....

a segunda é mais ou menos o que expliquei e a primeira é o modo mais tradicional.. relacionar as chaves estrangeiras criar os index (tb não haveria problemas)

 

Abraços

marco

Compartilhar este post


Link para o post
Compartilhar em outros sites

Antes de tudo, obrigado Marco.

Essa será minha tabela principal cada vez que alguém submeter uma busca fara um select, mais ou menos assim

 

SELECT * FROM tabela WHERE estado = %s AND cidade = %s AND bairro = %s AND status = %s ORDER BY ranking DESC LIMIT 0,10

 

Você disse no post que "50.000 registros a consulta com ctz nem ia carregar a página"

O que quis dizer com isso:

- Você acha que o mySQL não processara a consulta

- O tempo para processar a consulta será maior que o tempo que o Timeout do PHP (30s) antes mesmo que de tempo de rodar as impressões na página.

 

E pensando depois que havia postado ontem, posso colocar as cidades cadastradas em outra tabela apenas e na hora do usuário cadastrar ao invés de colocar um text field, coloco um select field padronizando a digitação.

Sobre terceira opção que havia pensando em colocar um campo com um ID da cidade, seria para agilizar a busca baseado no que me haviam dito, que as buscas através de índices numéricos são muito mais rápidos que buscas em texto, então usaria o ID para filtrar e o campo com o nome da CIDADE / BAIRRO para imprimir para o usuário.

Agradeço pela ajuda.

Vlw

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você disse no post que "50.000 registros a consulta com ctz nem ia carregar a página"

50.000 não é nem a unha do MySQL Amigo, pode ficar despreocupado quanto á isso

 

- Você acha que o mySQL não processara a consulta

Dependendo do Storage Engine que você estiver usando, pode ser que haja um intervalo na consulta, mais coisa de

0 - 20 segundos, usando Engine InnoDB, com formatos de linha Dynamic, juntamente á um INDEX, acredito que sua

tabela será igual uma turbina de avião, pra ser mais exato, um A380.

 

- O tempo para processar a consulta será maior que o tempo que o Timeout do PHP (30s) antes mesmo que de tempo de rodar as impressões na página.

Não .. isso é bom fazer uma paginação, porque 50.000 registros pro PHP processar não é pouca coisa ..

então você com os resultados na não, você vai limitando a exibição dos mesmos

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.