← Desenvolvimento

[Mysql] Dicas de optimização

Lida 2873 vezes

Offline

Spread 
Membro
Mensagens 1433 Gostos 2
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Boas pessoal

Estou a pensar em concretizar um projecto e necessito de dicas de como optimizar o tempo de acesso e ocupação do processador gerado por uma base de dados mysql. Tenho encontrado vários truques e dicas para optimizar o php mas não encontro nada sobre a db :S

A minha principal dúvida é se a posição do conteúdo nas tabelas influência ou não as pesquisas, isto é, numa tabela com 3 itens é mais rápido pesquisar sobre o primeiro item ou se é indiferente.

123ssddffssddff

Cumps 8)
Offline

marsupillami 
Equipa
Mensagens 850 Gostos 4
Feedback +1

Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 500 Posts

À partida a posição dos dados numa tabela é indiferente. O importante, é teres em consideração os INDEX´s que defines, tais como certas propriedades que caracterizam determinado campo. Um campo único, chaves primárias, etc... são formas de indexação interna dos dados que resultarão numa performance superior quando considerado o tempo de acesso.

O tempo de concretização de uma query começa a ser importante quando se tratam de composições de diversas querys. Especial atenção aos JOIN´s, pois são estes que conseguem colocar um load sobre uma tabela imenso. Por vezes é preferível fazer subdivisões de JOIN´s, para não colocar tudo numa só query, tornando o processo total de selecção de dados mais eficiente, embora tendo mais linhas de código.

Last, but not least, é importantíssimo o hardware sobre o qual corre o servidor de MySQL, e a configuração orientada para determinado processo. O servidor MySQL deverá ser capaz de criar várias threads simultâneas, distribuindo-as pelos CPU´s em ambientes SMP. Será importante também averiguar até que ponto criar caches de querys frequentes na RAM, será preferível.

Ainda para concluir, existem diversos tipos de tabelas, com diferentes vantagens e desvantagens. As mais importantes e vulgares são o MyISAM, InnoDB e MEMORY. No fundo, InnoDB será uma boa escolha para tabelas com muitos indexes e frequentemente acedidas cuja integridade dos dados é tão importante quanto o rápido acesso a eles, MyISAM é o ideal para "storage", onde existe bastante segurança de dados, e pouca utilização de recursos e MEMORY é perfeita para alocar em memória a tabela, e assim aproveitar os seeks diminutos e elevada largura de banda deste interface, tendo e conta no entanto que a um mero shutdown, todos os dados são perdidos (utilizada sobretudo para SESSION´s por exemplo, ou outros dados descartáveis).

Verás que uma optimização da estrutura de dados por vezes é muito mais importante que optimizações ao nível de PHP. É exactamente a estrutura de dados que por vezes origina "bottlenecks" em sites de imensos acesso, criando depois a dependência em hardware de grande capacidade, por vezes para tarefas não muito complexas.
Offline

Spread 
Membro
Mensagens 1433 Gostos 2
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Epáh quase que falas-te chinês para mim :) Mas não há crise, vou aprofundar alguns dos conceitos que apresentas-te e se continuar com dúvidas apito :P Fiquei no entanto com uma dúvida (que penso não ser simples de pesquisar), quando falas em JOIN's estás a falar em parâmetros de acesso à db ( por exemplo and's e or's )?

Cumps 8)
Offline

anjo2 
Membro
Mensagens 3020 Gostos 0
Troféus totais: 31
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Offline

Spread 
Membro
Mensagens 1433 Gostos 2
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Offline

marsupillami 
Equipa
Mensagens 850 Gostos 4
Feedback +1

Troféus totais: 28
Trófeus: (Ver todos)
Super Combination Combination Topic Starter Poll Voter Level 5 Level 4 Level 3 Level 2 Level 1 500 Posts

Os JOIN´s são basicamente junções de tabelas com bases comparativas. São usados em aplicações que utilizem muita informação proveniente da base de dados.

Por exemplo:

Tens duas tabelas, uma de utilizadores, e uma de encomendas. Queres saber, para cada utilizador todos os dados (nome, morada, telefone, etc...), e todas as informações das encomendas que ele efectuou.

- A forma lógica seria fazeres um SELECT, onde criarias um JOIN entre as duas tabelas, de forma  a obteres toda a informação numa só linha.
- A forma alternativa seria criares um SELECT na tabela utilizadores, e para cada utilizador criares um novo SELECT à tabela encomendas WHERE id_user = $var_id actualmente no ciclo.

Descupa o palavreado técnico, mas como dizes, tendo já algo assim sintetizado, poderás procurar no Google e compreender melhor.
Offline

Spread 
Membro
Mensagens 1433 Gostos 2
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Já percebi mais ou menos como funciona e não se aplica ao meu caso pois vou trabalhar somente com uma tabela .

Cumps 8)
Offline

Spread 
Membro
Mensagens 1433 Gostos 2
Troféus totais: 29
Trófeus: (Ver todos)
Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Poll Starter Level 5 Level 4 Level 3 Level 2

Boas

Tive a analizar novamente a minha situação e acho que vou dividir a informação entre várias tabelas. Na vossa opinião estarei a fazer correcto colocar os dados de uma tabela como InnoDB (esta tabela comportará os dados pesquisaveis pelo motor de busca) e os restantes noutra tabela MyISAM? Quando for feita uma pesquisa e clicado num link este terá que fazer join entre ambas as tabelas para devolver toda a informação. Esta é uma forma de ter as queryes optimizadas?

Cumps 8)
Offline

Emanuel Santos 
Elite
Mensagens 848 Gostos 2
Feedback +25

Troféus totais: 25
Trófeus: (Ver todos)
Windows User Super Combination Combination Topic Starter 10 Poll Votes Poll Voter Level 4 Level 3 Level 2 Level 1

Este blog é mesmo excelente para optimizações mysql : http://www.mysqlperformanceblog.com/