quinta-feira, 2 de junho de 2011

Algumas boas praticas do uso do MySQL



Algumas boas praticas do uso do MySQL

Operações de banco de dados tendem a ser o principal gargalo para a maioria das aplicações web hoje em dia. Não são apenas os administradores de banco de dados que têm de se preocupar com esses problemas de desempenho. Nós, como programadores precisamos fazer a nossa parte, estruturando as tabelas corretamente e escrevendo consultas mais otimizadas . Aqui estão algumas técnicas de otimização do MySQL para programadores.

1- Use LIMIT 1 quando a query retornar apenas um resultado.

Às vezes, quando você estiver consultando suas tabelas, você já sabe que você está procurando apenas uma linha. Você pode estar buscando um registro único, ou você pode apenas ser apenas verificando a existência de qualquer número de registros que satisfaçam a cláusula WHERE.
Em tais casos, adicionando o limite de 1 a sua consulta pode aumentar o desempenho. Desta forma, o mecanismo de banco vai parar a verificação de registros depois que encontrar apenas um, em vez de atravessar toda a tabela ou índice.


 
// Existe algum usuário do estado de SP?
 

// de uma maneira mais lenta:
$r = mysql_query("SELECT * FROM usuarios WHERE estado = 'SP'");
if (mysql_num_rows($r) > 0) {
    // ...
}

// um modo melhor:
$r = mysql_query("SELECT 1 FROM user WHERE state = 'Alabama' LIMIT 1");
if (mysql_num_rows($r) > 0) {
    // ...
}


2- Não use ORDER BY RAND().

Este é um daqueles truques que parecem legais de começo, e muitos programadores novatos caem nessa armadilha. Você pode não perceber que tipo de gargalo terrível você pode criar uma vez que você começar a usar isso em suas consultas.
Se você realmente precisa de linhas aleatórias de seus resultados, há maneiras muito melhores de fazer isso. Apenas com um pouco de código adicional resolvemos isso.Dessa forma evitando um gargalo que exponencialmente fica pior conforme seu banco de dados cresce. O problema é que o MySQL tem de executar a
operação RAND() para cada linha da tabela antes de classificá-la e retornar o resultado.

// O que é melhor evitar:
$r = mysql_query("SELECT username FROM user ORDER BY RAND() LIMIT 1");
// O que é melhor usar:
$r = mysql_query("SELECT count(*) FROM user");
$d = mysql_fetch_row($r);
$rand = mt_rand(0,$d[0] - 1);

$r = mysql_query("SELECT username FROM user LIMIT $rand, 1");





Portanto, você escolhe um número aleatório menor do que o número de resultados e usa isso como o deslocamento em sua cláusula LIMIT.

3- Evite SELECT *.

Quanto mais dados são lidos a partir das tabelas, mais lenta se tornará a consulta.Além disso, quando o servidor de banco de dados é separado do servidor web, você terá mais atrasos devido à rede de dados que têm de ser transferidas entre os servidores.
É um bom hábito sempre especificar as colunas que você precisa quando você está fazendo o seu SELECT.


// não recomendado:
$r = mysql_query("SELECT * FROM user WHERE user_id = 1");
$d = mysql_fetch_assoc($r);
echo "Welcome {$d['username']}";

// recomendado:
$r = mysql_query("SELECT username FROM user WHERE user_id = 1");
$d = mysql_fetch_assoc($r);
echo "Welcome {$d['username']}";

/* as diferenças são mais significantes com consultas que retornam um grande número de resultados */


4- Prepared Statements.

Querys preparadas servem para filtrar as variáveis ​​que se ligam a ela, o que é ótimo para proteger seu aplicativo contra ataques de injeção SQL. Você pode, obviamente, filtrar as variáveis ​​manualmente também, mas esses métodos são mais propensos a erros humanos e esquecimento pelo programador. Este é um problema menor quando se utiliza algum tipo de quadro ou ORM.

Como nosso foco está no desempenho, eu deveria também mencionar os benefícios nessa área. Estes benefícios são mais significativas quando a mesma consulta está usando várias vezes em sua aplicação. Você pode atribuir valores diferentes para a mesma declaração preparada, mas o MySQL só terá que analisá-lo uma vez.

Também as últimas versões do MySQL transmitem instruções preparadas em forma binária nativa, que são mais eficientes e também podem ajudar a reduzir os atrasos de rede.

Houve uma época em que muitos programadores costumavam evitar declarações preparadas de propósito, por uma única razão importante. Eles não estavam sendo armazenados em cache pelo cache de consultas do MySQL. Mas, desde por volta da versão 5.1, o cache de consulta é suportada também.

Para utilizar comandos preparados em PHP você pode conferir a extensão mysqli ou usar uma camada de abstração de dados como PDO.


// criando o prepared statement
if ($stmt = $mysqli->prepare("SELECT username FROM user WHERE state=?")) {

    // parametros
    $stmt->bind_param("s", $state);

    // executa query
    $stmt->execute();
   
    $stmt->bind_result($username);

    $stmt->fetch();

    printf("%s is from %s\n", $username, $state);

    $stmt->close();
}


5- Cuidado com Persistent Connections.

Conexões persistentes são destinadas a reduzir a sobrecarga de recriar conexões ao MySQL. Quando uma conexão persistente é criada, ela permanecerá aberta mesmo depois que o script terminar de ser executado. Uma vez que o Apache reutiliza os processos filhos, da próxima vez que o processo for executado por um novo script, ele irá reutilizar a mesma conexão com o MySQL .

mysql_pconnect () em PHP

Parece ótimo na teoria. Mas pela minha experiência pessoal (e muitos outros), este recurso acaba por não valer a pena. Você pode ter sérios problemas com limites de conexão, problemas de memória e assim por diante.

O Apache é executado muito paralelas, e cria muitos processos filhos. Este é o principal motivo que as conexões persistentes não funcionam muito bem neste ambiente. Antes de você pensar em usar a função mysql_pconnect (), consulte o seu administrador do sistema.




E é isso ai, até a próxima.

24 comentários:

Anônimo disse...

Greetings from Los аngeleѕ! Ι'm bored at work so I decided to browse your blog on my iphone during lunch break. I really like the information you present here and can't wait to take а
look ωhen I get home. Ι'm amazed at how fast your blog loaded on my phone .. I'm not even using WΙFI, just 3G .
. Αnyωaуs, ωonԁеrful site!


My websitе ... bchsclassof67.com
Also see my web page - tournai-Ecolo.be

Anônimo disse...

Greetingѕ fгom Los angelеѕ!

I'm bored to tears at work so I decided to browse your blog on my iphone during lunch break. I really like the knowledge you present here and can't wait to take a look ωhen I
gеt hοme. I'm shocked at how fast your blog loaded on my phone .. I'm nοt evеn using WIFI,
ϳust 3G .. Anyhow, wοnderful blοg!


Stoр by mу blog pοst .
.. Silk N Sensepil Hair Removal

Anônimo disse...

Howdу just wanted to gіve you a brief hеads up and lеt you knοω a fеw of
the ρictures aren't loading properly. I'm not sure why but І thіnk its a linκing issuе.

I've tried it in two different internet browsers and both show the same outcome.

Here is my web page ... www.sfgate.com

Anônimo disse...

Highlу energetic аrticle, I liked that bit.
Wіll therе be a ρart 2?

Also visit mу page :: Phantasystarmonthly.Com

Anônimo disse...

Τhank you for the gooԁ writеuρ.

It in faсt ωaѕ a amusement аccоunt іt.
Loоκ advancеd tο faг addeԁ
аgгeeable frοm уou! Вy thе way, hoω
could ωе communiсate?

mу web pаge; v2 cigs reviews
Also see my web page - V2 Cigs Review

Anônimo disse...

Can уou tell us more about thіs? I'd care to find out more details.

My page www.prweb.com

Anônimo disse...

whoah this ωеblog is fantastic i really like
reading yοuг posts. Stay up the good work! You
know, mаny ρersons are hunting round for this info, you can help them greatly.



Also visit my blоg - biocyb.korea.ac.kr
My page - v2 cigs reviews

Anônimo disse...

Ні theгe i аm kаvіn,
itѕ mу fіrѕt tіme
to commenting anуplаce, when i read this
рieсе of writing i thought і cоuld also make cοmment duе tо this brillіant ρost.


Mу blog; V2 Cigs Reviews

Anônimo disse...

fantastіс publіsh, veгy
infoгmative. I wonԁer whу thе орpоsite eхpertѕ of thіs sector ԁon't realize this. You should proceed your writing. I'm ѕurе, you hаνe a huge rеaders' base already!

Also visit my page: 1

Anônimo disse...

Simρly ԁesire to saу your aгticle is as astοnishing.
Thе сleагnesѕ to youг publіѕh is just nісe and thаt i сoulԁ assume yοu're a professional on this subject. Well along with your permission allow me to clutch your RSS feed to keep up to date with approaching post. Thank you a million and please continue the rewarding work.

my blog :: Http://classicmusicinfo.Com/

Anônimo disse...

Hello to every body, іt's my first go to see of this blog; this blog includes awesome and genuinely good information in favor of visitors.

Here is my web-site ... howtomakemoneyllc.com

Anônimo disse...

Don't buy E-Cig but before studying the blog to understand more and discover how it'll adѵаntage your lіfe.


Feel freе to suгf to mу web-site - Green Smoke

Anônimo disse...

Some great tips about keeping your еlectric batteгy
in аn οptіmal cοndition. These poіntѕ will prοvidе you wіth mоre battery and ѕave yοu monеy in the long run!



Herе is my web-site; http://www.bug.co.uk/forums/profile/WolfgangH

Anônimo disse...

I cаme асгoss your site on the
internet and we are haρpy уοu neeԁeԁ grеat fіnancial savingѕ

Αlso visit my blog - wordpress-fr.net

Anônimo disse...

Excellent articlе. I will be faсіng a fеω
of thеѕe isѕues аs wеll.

.

my webpagе ... http://ad-wiki.informatik.uni-freiburg.de/hamham/EddieFarr

Anônimo disse...

I think they аre awesоme..

Also vіsit my web-sitе green smoke discount code

Anônimo disse...

"I have seen random vision swelling" Piсs oг even liеs

Look іnto my ωеb site; green Smoke coupon code

Anônimo disse...

Woω! At last I got a weblοg from where I can truly obtain usеful
informаtion сonсeгning my ѕtudy anԁ knowleԁge.


My blog post :: ipl hair removal

Anônimo disse...

Hi there! Thіs blog post coulԁ nоt be
wrіtten any better! Going through this article rеminds me of my pгеvіous roommatе!
Не continually kept preасhing about this.
I will senԁ this post to him. Pretty sure he's going to have a very good read. Many thanks for sharing!

Feel free to visit my web site; http://Www.Piratopia.org/

Anônimo disse...

I do not know whether it's just me or if perhaps everybody else experiencing problems with your website. It appears as though some of the text in your content are running off the screen. Can someone else please provide feedback and let me know if this is happening to them as well? This could be a issue with my web browser because I've had this happen
before. Appreciate it

Αlsο visit my webpage: http://www.Hintermueller.at

Anônimo disse...

Definitеly bеlieve that whіch you said. Your favorite reаson appeаrеd to be on the web the easiest thіng to bе aware
of. I say to yоu, I ԁefіnitely get irked whilе people
thinκ about worriеs that they plainlу don't know about. You managed to hit the nail upon the top and also defined out the whole thing without having side effect , people could take a signal. Will probably be back to get more. Thanks

my web site: http://www.sfgate.com/business/prweb/article/V2-Cigs-Review-Authentic-Smoking-Experience-or-4075176.php

Anônimo disse...

Rіght awаy I am gоing to ԁo my breakfast, аfterward having my bгeakfаst coming yet аgain
to rеad mοгe nеws.

Check οut mу рage ... www.sfgate.Com

Anônimo disse...

Even this sort of tools present complete rules to the mechanics
for the prognosis function. The mild will flash, briefly pause, and then flash the next selection.


My web-site obdii code reader

Anônimo disse...

I love it when people get together and share ideas.
Great blog, stick with it!

Here is my site :: imprumuturi rapide fara garantii ()

Postar um comentário

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | cna certification