eu tenho um banco de dados científico com atualmente 4.300.000 registros. É um banco de dados científico e uma API está alimentando-o. Em junho de 2020, provavelmente terei cerca de 100.000.000 de registros.
este é o layout da saída da tabela’:
ID | sensor_ID | speed | velocity | direction-----------------------------------------------------1 | 1 | 10 | 1 | up2 | 2 | 12 | 2 | up3 | 2 | 11.5 | 1.5 | down4 | 1 | 9.5 | 0.8 | down5 | 3 | 11 | 0.75 | up...
BTW, estes são dados fictícios. Mas a saída é uma tabela com 5 colunas: ID, sensor_ID, velocidade, velocidade e direção.
o que eu quero alcançar é um método decente de paginação e filtro. Quero criar um site (no nodejs) onde este +4.000.000 registros (por enquanto) serão exibidos, 10.000 registros por página. Eu também quero ser capaz de filtrar sensor_ID, velocidade, velocidade ou direção.
por enquanto, tenho essa consulta para selecionar linhas específicas:
SELECT * FROM output ORDER BY ID DESC OFFSET 0 LIMIT 10000 // first 10,000 rowsSELECT * FROM output ORDER BY ID DESC OFFSET 10000 LIMIT 10000 // next 10,000 rows...
estou procurando algumas informações / dicas sobre como criar um método de paginação decente. Por enquanto, ainda está quieto rápido do jeito que eu faço, mas acho que será muito mais lento quando atingirmos +50.000.000 de registros.
em primeiro lugar, encontrei esta página: https://www.citusdata.com/blog/2016/03/30/five-ways-to-paginate/. Estou interessado na paginação do keyset. Mas, para ser honesto, Não tenho ideia de como começar.
o que eu acho que devo fazer:
crie um índice no campo ID:
CREATE UNIQUE INDEX index_id ON output USING btree (ID)
eu também encontrei esta página: https://leopard.in.ua/2014/10/11/postgresql-paginattion. Ao rolar para baixo até “melhoria #2: O Método de busca”, você pode ver que eles descartaram a cláusula OFFSET e estão usando uma cláusula WHERE. Também vejo que eles estão usando o último ID de inserção em sua consulta:
SELECT * FROM output WHERE ID < <last_insert_id_here> ORDER BY ID DESC LIMIT 10000
eu não entendo completamente isso. Para a primeira página, preciso do último ID de inserção. Então eu busco os 10.000 registros mais recentes. Mas depois disso, para obter a segunda página, não preciso do último ID de inserção, preciso do 10.000º último ID de inserção (eu acho).
alguém pode me dar uma boa explicação sobre paginação e filtragem de maneira rápida.
as coisas que estou usando: – postgresql – pgadmin (para gerenciamento de banco de dados) – node.js (versão mais recente)
obrigado a todos! E tenha um bom 2020!
Editar 1: Não tenho ideia, mas massiveJS (https://massivejs.org/) poderia ser algo bom de usar? E devo usá-lo em todas as consultas ou apenas nas consultas de paginação?
Editar 2: Acho que descobri um pouco (corrija-me se estiver errado).
Vamos dizer que eu tenho de 100.000 registros:
1) Obtenha a última inserido ID
2) Usar esta última inserida ID para buscar os últimos 10.000 registros
SELECT * FROM output WHERE ID < 100000 ORDER BY ID DESC LIMIT 10000 // last insert ID is here 100,000 because I have 100,000 records
3) Mostrar a 10.000 registros, mas também para salvar a inserir o ID de 10.000 registro para usar na próxima consulta
4) Obter o próximo 10.000 registros com os novos última inserir id
SELECT * FROM output WHERE ID < 90000 ORDER BY ID DESC LIMIT 10000 // 90,000 is the very last insert id - 10,000