Como determinar o “número de páginas” de forma mais eficaz?
-
19-08-2019 - |
Pergunta
Espero não estou escrevendo um duplicado, mas eu não encontrei qualquer coisa que responde a minha pergunta. (Embora me parece ser um problema bastante comum.)
O problema ocorre em quase todos os projetos web: Você tem uma tabela com muitas muitas entradas e quer que eles sejam exibidos em páginas individuais.
Agora eu me pergunto qual é a melhor maneira de calcular o número de páginas necessárias para um determinado conjunto de linhas da tabela.
Aqui algumas abordagens eu estive pensando. Eu gostaria de obter alguma resposta sobre a forma como eles são eficazes. Vou dar exemplos específicos de PHP, mas eu aposto que existem técnicas semelhantes em outras línguas.
-
A provavelmente melhor maneira é para salvar o número de páginas estaticamente e modificar o valor cada vez que uma nova entrada é adicionada. (No entanto ... Eu estou procurando uma solução dinâmica :-))
-
Faça um
SELECT COUNT(*)
sobre as linhas de interesse e calcular o número da página a cada vez que a página é exibida. -
Faça um ordinária escolha para obter um conjunto de resultados para todas as linhas. Agora não carregar as linhas chamando
mysql_fetch_row
ou assim, mas obter o número de linhas commysql_num_rows
. (Desde que eu não tenho nenhuma idéia de como isso é implementado Eu não posso dizer se é eficaz ou não. Quem sabe?) Então eu poderia confortavelmente mover o ponteiro conjunto de resultados. (Paramysqli
hámysql_data_seek
, mas a extensão MySQL nativa não tem função similar. Portanto, eu supor que este é apenas um comportamento de buffer demysqli
)
Alguém pode dizer como contar o número de linhas (número de páginas) de forma mais eficaz?
Solução
Número 2 é o padrão mais comum
select count(*) from [Table] where [Expressions]
E, em seguida,
select [Columns] from [Table] where [Expressions] limit [Pagesize] offset [Pagenum*Pagesize-Pagesize]
Isto dá-lhe o total de linhas para todo o conjunto de resultados, mas apenas os dados das linhas para a página atual.
Muitas estruturas ou CMSes têm convenções para cache de certas partes de dados na sessão que você pode ou-não querem fazer dependendo o esperado tamanhos de mesa, a volatilidade dos dados, etc.
Outras dicas
Se você realmente queria algo de proporções WTF Verdadeiramente, você pode sempre manter o controle de quantas linhas foram incrementando alguns registrar usando um disparador em insert / delete.
Mas eu acho que isso é uma resposta pedindo ainda mais perguntas;).
Basta usar SELECT COUNT se você tiver que. Se seu lento, isso significa que seu banco de dados é construído errada normalmente.
Além disso, tenho a sensação de que é otimização prematura rastejando aqui. Não otimizar prematuramente. Torná-lo faz sentido, e depois torná-lo faz sentido melhor. Faz sentido?
Se bem entendi, na maioria dos sistemas eu trabalhei em que eu precisava o número de páginas ao mesmo tempo como eu estou pegando um novo conjunto de linhas para uma página. Isso permite que uma exibição de "página N de M" ou algo parecido como o título, e uma tela cheia de entradas.
O banco de dados dependente, mas geralmente você passar no número current_page (ou número de linha), em seguida, fazer uma "consulta limitada" (FetchSize, superior, etc.) para obter o próximo conjunto de linhas e um número total de páginas. Concedido fica feio se o número de linhas está mudando por baixo, mas eu normalmente não se preocupe com isso.
Paul.
Eu acho que você quer construir a sua navegação em torno de uma única consulta SQL que modifica apenas a palavra-chave LIMIT. Por exemplo SELECT * FROM myTable LIMIT 0,20 retornará as primeiras 20 linhas. No seu script PHP para a página 2, então você vai definir a consulta SQL para ser SELECT * FROM MyTable LIMIT 20,40 retornando, assim, linhas de 20 a 40. É isso que você estava procurando?
A navegação pode ser construído com o seu script PHP simplesmente fazendo um SELECT COUNT (*) / rowsPerPage e looping, assim, uma estrutura de código até encontrar o número total de linhas. A consulta final seria então LIMIT para lastLimit, TotalRowCount.
Edit: para calcular quantas páginas você precisa para calcular todas as linhas que você precisa para definir quantas linhas 1 página pode ter. Você, então, fazer totalRows / MaxPerPage = howManyPagesNeeded
2 questões a considerar neste contexto:
- como lidar com dados que são atualizados / inseridos enquanto você está vendo?
- quantos usuários simultâneos será visitar os dados, e a aplicação será capaz de manter-se com o tráfego quando ele busca páginas de dados dinamicamente?
Dependendo das respostas, algumas das outras respostas aqui podem ou não se aplicar.
Você pode querer verificar esta questão , é muito semelhante ao que você está pedindo.
Uma boa maneira de fazer isso é usar SQL_CALC_FOUND_ROWS
Exemplo:
SELECT SQL_CALC_FOUND_ROWS * FROM tbl_name WHERE id > 100 LIMIT 10;
SELECT FOUND_ROWS();
Mesmo que você está limitando a consulta para 10 resultados, a segunda consulta irá retornar as linhas totais reais que teriam sido devolvidos se você não tivesse usado um limite.
É importante notar que FOUND_ROWS()
não é confiável quando se utiliza do MySQL replicação de banco de dados
Na verdade, se você está enchendo uma página web com PHP, é mais fácil de obter apenas a tabela MySQL, colocar os dados em uma matriz e usar um loop for para ir throught os dados como este
for($i=0;$i<count($arrayvar);$i++){}
Com ainda um motor de modelo simples, você pode declarar um bloco dentro de outro bloco e analisar todos os dados em uma linha consequtive.
Hope esse é o tipo de resposta que você está procurando. Eu realmente não estou claro sobre o que você quer dizer com a sua pergunta, mas eu acho que é isso.