Ir para conteúdo

POWERED BY:

Arquivado

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

Danilo Dantas

Melhorar Quey

Recommended Posts

Olá!

 

Estava fazendo uns testes com o MySQL aqui em localhost. Criei uma tabela idiota e adicionei 10 268 082 registros nela.

 

Mostrando registros 10267980 - 10268009 (10,268,082 total, Consulta levou 7.3155 segundos)
consulta SQL:
SELECT *
FROM `teste`
LIMIT 10267980 , 30

Executando essa query, ele pega os resultados entre os IDs 10267981 e 10268010, mas como se pode ver, demora muito.

 

Mostrando registros 0 - 29 (30 total, Consulta levou 0.0007 segundos)
consulta SQL:
SELECT *
FROM `teste`
WHERE id >=10267981
AND id <=10268010

Com essa, ele pega os mesmos resultados, porém, muito mais rapidamente.

 

Minha duvida é seguinte: Vou fazer paginação no meu site, como faço pra pegar, por exemplo, o que eu pegaria usando LIMIT 1000,30 usando algum outro comando SQL? Não da pra fazer usando id > e id < pq minhas ids não são totalmente periódicas, quando deleto algo, a id é perdida, o que atrapalharia a listagem caso eu usasse id > e id <.

 

[]´s!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Danilo

 

resete o computador e inverta a ordem das querys, ou seja, primeiro a que levou 0.0007 segundos e depois a de 8 segundos , você vai ver que a segunda query quase sempre leva 0.0007 segundos pq o resultado ja esta "na mente"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Danilo

 

resete o computador e inverta a ordem das querys, ou seja, primeiro a que levou 0.0007 segundos e depois a de 8 segundos , você vai ver que a segunda query quase sempre leva 0.0007 segundos pq o resultado ja esta "na mente"

Acabei de iniciar o Xampp e executar as querys na ordem que você falou. A com LIMIT foi igualmente lenta e a com WHERE igualmente rápida.

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema não é o uso de LIMIT ou WHERE, o que acontece é que, id deve ser sua chave primária, ou seja, uma coluna indexada e ordenada internamente. Quando colocada uma coluna indexada na clásula WHERE, é até recomendado...mas, quando se coloca ORDER BY e ainda mais LIMIT em uma em uma consulta, mesmo estando essa indexada, atrasa muito o retorno do resultado.

 

Vamos lá: "O que acontece quando existe um ORDER BY em uma consulta?"

 

A tabela é lida completamente, em quase todas as situações e após montado o resultado, é realizada uma operação interna chamada SORT ou CLASSIFICAÇÃO, ordenando o conjunto da forma como foi solicitado, satifazendo a consulta.

 

Um comando que auxilia e muito o tunning de consultas no MySQL é o EXPLAIN: http://dev.mysql.com/doc/refman/5.0/en/explain.html , dê uma olhada nele e em seus respetivos resultados, este comando te informará o comportamento do otimizador de consultas do MySQL.

 

Um abraço, DEUS abençõe!! http://forum.imasters.com.br/public/style_emoticons/default/natal_wink.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema não é o uso de LIMIT ou WHERE, o que acontece é que, id deve ser sua chave primária, ou seja, uma coluna indexada e ordenada internamente. Quando colocada uma coluna indexada na clásula WHERE, é até recomendado...mas, quando se coloca ORDER BY e ainda mais LIMIT em uma em uma consulta, mesmo estando essa indexada, atrasa muito o retorno do resultado.

 

Vamos lá: "O que acontece quando existe um ORDER BY em uma consulta?"

 

A tabela é lida completamente, em quase todas as situações e após montado o resultado, é realizada uma operação interna chamada SORT ou CLASSIFICAÇÃO, ordenando o conjunto da forma como foi solicitado, satifazendo a consulta.

 

Um comando que auxilia e muito o tunning de consultas no MySQL é o EXPLAIN: http://dev.mysql.com/doc/refman/5.0/en/explain.html , dê uma olhada nele e em seus respetivos resultados, este comando te informará o comportamento do otimizador de consultas do MySQL.

 

Um abraço, DEUS abençõe!! http://forum.imasters.com.br/public/style_emoticons/default/natal_wink.gif

Certo, mas qual seria uma alternativa mais rápida ao LIMIT? Tentei olhar o source do phpBB pra ver como ele fazia, e até o phpBB usa LIMIT...

 

[]´s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para paginar, todo mundo utiliza o LIMIT e é normal, mas existem problemas gerados pela lentidão que este provoca em queries.

Tente reavaliar os seus índices e estudar o EXPLAIN para analisá-las...outros fatores também devem ser avalidos como hardware, por exemplo.

 

O pacote ADODB trabalha de forma interessante com a paginação, mantendo as consultas em buffer e trabalhando diretamente com este espeço de memória.

 

Abraço!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para paginar, todo mundo utiliza o LIMIT e é normal, mas existem problemas gerados pela lentidão que este provoca em queries.

Tente reavaliar os seus índices e estudar o EXPLAIN para analisá-las...outros fatores também devem ser avalidos como hardware, por exemplo.

 

O pacote ADODB trabalha de forma interessante com a paginação, mantendo as consultas em buffer e trabalhando diretamente com este espeço de memória.

 

Abraço!

Vou dar uma olhada nesse ADODB. A uma primeira impressão parece bem completo, completo até de mais, quase 2MB só de código http://forum.imasters.com.br/public/style_emoticons/default/natal_tongue.gif

 

Obrigado plea ajuda! http://forum.imasters.com.br/public/style_emoticons/default/natal_wink.gif

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.