Otimização de consultas SQL usando LIMIT

Artigo que apresenta uma forma de otimizar consultas SQL através da especificação do LIMIT.

performance

É muito comum realizar consultas no Banco de Dados que esperam receber no máximo uma linha de resultado. Por exemplo, durante a autenticação de um usuário (log-in), para recuperar o registro do BD e comparar a senha com aquela informada no formulário.

Nestes casos, pode ser útil incluir a cláusula "LIMIT", implementada por diferentes SGBDs (por exemplo, MySQL e PostgreSQL).

Se é esperado no máximo um resultado, então inclua o "LIMIT 1" no final do SELECT. Desta forma, o SGBD sabe que se encontrar algum registro não precisa percorrer os demais registros. Alguns SGBDs podem fazer isso automaticamente quando percebem que a condição de busca utilizada é feita através de um campo único (por exemplo, a própria chave primária da tabela). Afinal, se o campo é único e um registro já foi encontrado, não devem existir outros registros com o mesmo valor.

Exemplo:

$stmt = $pdo->prepare("SELCT login, senha FROM usuarios WHERE login = ':login' LIMIT 1");

Outra condição frequênte é para determinar se existem pelo menos N registros com determinada condição. Neste caso, é possível fazer o SELECT usar a função COUNT para determinar a quantidade de registros, mas incluir o LIMIT para parar de procurar caso já encontre N registros. Por exemplo, se queremos saber se existem pelo nos 5 usuários com login iniciado em "R", podemos fazer:

SELECT COUNT(login) as quantidade FROM (SELECT login FROM usuarios WHERE login LIKE 'r%' LIMIT 5) AS tabela;

Neste caso, o COUNT vai retornar 5, caso possua 5 ou mais usuários nestas condições, ou vai retornar um número menor que 5, caso existam menos. Ou seja, se existem milhões de usuários com estas condições, não será gasto tanto tempo, pois assim que os 5 primeiros forem encontrados, a SQL já devolverá o valor e não buscará outros registros.

8 comentários

historiasdesuavida disse...

ola amigo.

estou tentando usar um codigo aqui mais não ta dando certo.

$sql = mysql_query("SELECT * FROM noticias_dados order by id desc LIMIT < ? if( $ exib_twitter ! = ' sim ' ) { ? > 6< ? } else { ? > 12 " ) ;

o codigo acima era para funcionar assim.

se o 'exibir_twitter' estiver ativado : o limite vai ser (12)

se o "exibir_twitter' estiver desativado o limite vai ser (6)


::::::::::porque esta função::::::::::

porque no meu site, quando ativo o twitter a pagina cresce, e as noticias ficam la em cima e fica um espaço grande em baixo, porque as noticias ta exibindo 6 resultados
com o twitter é preciso que exiba 12 resultados para completar o espaço em branco..
ai para não ter que configura isso toda vez que ativar e desativar o twitter, coloquei essa função ai para trocar os valores "LIMIT" automatico..


a função funciona fora do "SELECT FROM"

MAIS DENTRO DO "SELECT FROM" da erro na syntax
alguem poderia me ajudar????????
desde já agradeço
................................................

rubS (autor do blog) disse...

Tente isso:

$limit = $exib_twitter != 'sim' ? 6 : 12;
$sql = mysql_query("SELECT * FROM noticias_dados order by id desc LIMIT {$limit}");

Anônimo disse...

mto bom mesmo...
achei outro artigo que complementa isso aí...
que tiver interesse:
http://tiemprosa.wordpress.com/2012/03/01/otimizacao-de-consultas/