O que é a forma mais eficiente para paginar o meu site quando a consulta SQL?
Pergunta
Eu estou tentando para paginar os resultados de uma consulta SQL para uso em uma página da web.A linguagem e o banco de dados de back-end são PHP e SQLite.
O código eu estou usando o works algo como isto (página numeração começa em 0)
http://example.com/table?page=0
page = request(page)
per = 10 // results per page
offset = page * per
// take one extra record so we know if a next link is needed
resultset = query(select columns from table where conditions limit offset, per + 1)
if(page > 0) show a previous link
if(count(resultset) > per) show a next link
unset(resultset[per])
display results
Existem formas mais eficientes para fazer a paginação do que isso?
Um problema que eu posso ver com meu atual método é que eu deve armazenar todos os 10 (ou muitos) resulta na memória, antes de começar a exibi-los.Eu faço isso porque DOP não garante que a contagem de linha estará disponível.
É mais eficiente para um problema COUNT(*)
consulta para saber quantas linhas existem, em seguida, transmitir os resultados para o navegador?
É este um desses "depende do tamanho da sua mesa, e se o count(*)
consulta requer uma verificação de tabela no banco de dados back-end", "fazer alguns perfis de si mesmo" tipo de perguntas?
Solução
eu sugiro apenas fazendo a contagem em primeiro lugar.uma contagem(chave primária) é uma forma muito eficiente de consulta.
Outras dicas
Optei para ir com o COUNT(*) duas método de consulta, porque ele me permite criar um link diretamente para a última página, o que o outro método não permite.Realizar a contagem de primeira também me permite transmitir os resultados, e assim deve funcionar bem com o maior número de registros com menos memória.
A consistência entre as páginas não é um problema para mim.Obrigado por sua ajuda.
Existem vários casos onde tenho bastante complexo (9-12 associação de tabela de consulta, retornando muitos milhares de linhas, o que eu preciso para paginar.Obviamente, para paginar bem, você precisa saber o tamanho total do resultado.Com bases de dados MySQL, utilizando o SQL_CALC_FOUND_ROWS directiva, a ESCOLHA pode ajudar você a conseguir isso facilmente, embora o júri está fora se que será mais eficiente para você fazer.
No entanto, desde que você está usando o SQLite, eu recomendo ficar com o 2 consulta de abordagem. Aqui é muito concisa thread sobre o assunto.
Eu duvido que ele vai ser um problema para os usuários que esperar para que a infra-estrutura de retorno de dez linhas.(Você pode fazer isso para eles, por ser bom em especificar dimensões da imagem, certifique o servidor web negociar comprimido transferências de dados quando possível, etc.)
Eu não acho que vai ser muito útil para você fazer uma count(*) inicialmente.
Se você for até a alguns complicado de codificação:Quando o usuário está olhando para a página x, use ajax-como mágica para pré-carregar a página x+1 para melhorar a experiência do usuário.
Uma nota geral sobre paginação:Se as alterações de dados enquanto o usuário navega através de suas páginas, é pode ser um problema se a sua solução exige um alto nível de consistência.Eu tenho escrito uma nota sobre o que em outro lugar.