A cláusula LIMIT pode ser usada para restringir o número de linhas retornadas pela instrução SELECT. LIMIT usa um ou dois argumentos numéricos, que devem ser constantes inteiras não-negativas (exceto ao usar instruções preparadas).
Com dois argumentos, o primeiro argumento especifica o deslocamento da primeira linha a retornar e o segundo especifica o número máximo de linhas a serem retornadas. O deslocamento da linha inicial é 0 (não 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
Para recuperar todas as linhas de um determinado deslocamento até o final do conjunto de resultados, você pode usar um número grande para o segundo parâmetro. Esta instrução recupera todas as linhas da 96a linha até a última:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
Com um argumento, o valor especifica o número de linhas a serem retornadas desde o início do conjunto de resultados:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
Em outras palavras, LIMIT número_de-linha é equivalente a LIMIT 0, número-de-linha.
limit X, Y
, o que basicamente acontece é que as linhas X + Y são recuperadas e, em seguida, X linhas desde o início são descartadas e o que resta é retornado. Para reiterar:limit X, Y
resulta em varredura de linhas X + Y.OFFSET
;-)Para 500 registros, a eficiência provavelmente não é um problema, mas se você tiver milhões de registros, pode ser vantajoso usar uma cláusula WHERE para selecionar a próxima página:
O "234374" aqui é o ID do último registro da página anterior que você visualizou.
Isso permitirá que um índice no id seja usado para encontrar o primeiro registro. Se você usar,
LIMIT offset, 20
poderá descobrir que fica cada vez mais lento conforme você avança no final. Como eu disse, provavelmente não importa se você possui apenas 200 registros, mas isso pode fazer a diferença com conjuntos de resultados maiores.Outra vantagem dessa abordagem é que, se os dados mudarem entre as chamadas, você não perderá os registros nem obterá um registro repetido. Isso ocorre porque adicionar ou remover uma linha significa que o deslocamento de todas as linhas após a alteração. No seu caso, provavelmente não é importante - acho que seu pool de anúncios não muda com muita frequência e, de qualquer maneira, ninguém notaria se eles obtivessem o mesmo anúncio duas vezes seguidas - mas se você estiver procurando o "melhor caminho" isso é outra coisa a ter em mente ao escolher qual abordagem usar.
Se você deseja usar LIMIT com um deslocamento (e isso é necessário se um usuário navega diretamente para a página 10000 em vez de paginar pelas páginas uma por uma), você pode ler este artigo sobre pesquisas de linhas atrasadas para melhorar o desempenho de LIMIT com uma grande Deslocamento.
fonte
limit 1000000, 10
e esperar que funcione não o levará a lugar algum.area=width*height
por isso não é apenas a quantidade de registros que possam importam, mas o tamanho de cada registro também é um fator quando armazenar os resultados na memóriaDefina OFFSET para a consulta. Por exemplo
página 1 - (registros 01-10): deslocamento = 0, limite = 10;
página 2 - (registros 11-20) deslocamento = 10, limite = 10;
e use a seguinte consulta:
exemplo para a página 2:
fonte
Há literatura sobre isso:
Paginação otimizada usando MySQL , fazendo a diferença entre contar a quantidade total de linhas e paginação.
Paginação eficiente usando MySQL , do Yahoo Inc. na Percona Performance Conference 2009. A equipe Percona MySQL fornece também como um vídeo do Youtube: Paginação eficiente usando MySQL (vídeo) ,
O principal problema ocorre com o uso de grandes
OFFSET
s . Eles evitam usarOFFSET
várias técnicas, desdeid
seleções de intervalo naWHERE
cláusula até algum tipo de cache ou pré-computação de páginas.Existem soluções sugeridas em Use the INDEX, Luke :
" Paginando através dos resultados ".
" Paginação feita da maneira certa ".
fonte
Este tutorial mostra uma ótima maneira de fazer paginação. Paginação eficiente usando MySQL
Em resumo, evite usar OFFSET ou LIMIT grande
fonte
você também pode fazer
A contagem de linhas da instrução select (sem o limite) é capturada na mesma instrução select, para que você não precise consultar o tamanho da tabela novamente. Você obtém a contagem de linhas usando SELECT FOUND_ROWS ();
fonte
*
resultados em mais colunas do que o necessário estão sendo buscados e osSQL_CALC_FOUND_ROWS
resultados nessas colunas são lidos de todas as linhas da tabela, mesmo que não estejam incluídos no resultado. Seria muito mais eficiente calcular o número de linhas em uma consulta separada que não lê todas essas colunas. Em seguida, sua consulta principal pode parar após a leitura de 20 linhas.Consulta 1:
SELECT * FROM yourtable WHERE id > 0 ORDER BY id LIMIT 500
Consulta 2:
SELECT * FROM tbl LIMIT 0,500;
A consulta 1 é executada mais rapidamente com registros pequenos ou médios; se o número de registros for igual a 5.000 ou superior, o resultado será semelhante.
Resultado para 500 registros:
Query1 take 9.9999904632568 milissegundos
Query2 leva 19,999980926514 milissegundos
Resultado para 8.000 registros:
Query1 leva 129.99987602234 milissegundos
Query2 leva 160.00008583069 milissegundos
fonte
id
.id > 0
útil?offset
(o primeiro argumento a limitar é deslocamento), você ainda está selecionando todos os dados até o limite, descartando a quantidade do deslocamento e retornando a seção que está entreoffset
elimit
. com awhere
cláusula, por outro lado, você está definindo um tipo de ponto de partida para a consulta e consultaONLY
a parte específica.A paginação é simples quando busca dados de uma única tabela, mas é complexa quando recupera dados que unem várias tabelas. Aqui está um bom exemplo com o MySql e o Spring:
https://www.easycodeforall.com/zpagination1.jsp
fonte