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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top