J’ai une base de données scientifique avec actuellement 4 300 000 enregistrements. C’est une base de données scientifique, et une API l’alimente. En juin 2020, j’aurai probablement environ 100 000 000 d’enregistrements.

Ceci est la disposition de la table ‘sortie’:

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, ce sont des données factices. Mais la sortie est une table avec 5 colonnes: ID, sensor_ID, speed, velocity et direction.

Ce que je veux réaliser, c’est une méthode de pagination et de filtrage décente. Je veux créer un site Web (en nodejs) où ce +4 000 000 d’enregistrements (pour l’instant) seront affichés, soit 10 000 enregistrements par page. Je veux aussi pouvoir filtrer sur sensor_ID, speed, velocity ou direction.

Pour l’instant, j’ai cette requête pour sélectionner des lignes spécifiques:

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...

Je recherche des informations / conseils sur la création d’une méthode de pagination décente. Pour l’instant, c’est toujours calme et rapide comme je le fais, mais je pense que ce sera beaucoup plus lent lorsque nous atteindrons + 50 000 000 d’enregistrements.

Tout d’abord, j’ai trouvé cette page: https://www.citusdata.com/blog/2016/03/30/five-ways-to-paginate/. Je suis intéressé par la pagination du jeu de clés. Mais pour être honnête, je ne sais pas comment commencer.

Ce que je pense que je dois faire:

Créer un index sur le champ ID:

CREATE UNIQUE INDEX index_id ON output USING btree (ID)

J’ai également trouvé cette page: https://leopard.in.ua/2014/10/11/postgresql-paginattion. Lorsque vous faites défiler jusqu’à « Amélioration #2: La méthode Seek », vous pouvez voir qu’ils ont supprimé la clause OFFSET et utilisent une clause WHERE. Je vois également qu’ils utilisent le dernier ID d’insertion dans leur requête:

SELECT * FROM output WHERE ID < <last_insert_id_here> ORDER BY ID DESC LIMIT 10000

Je ne comprends pas tout à fait cela. Pour la première page, j’ai besoin du tout dernier ID d’insertion. Ensuite, je récupère les 10 000 enregistrements les plus récents. Mais après cela, pour obtenir la deuxième page, je n’ai pas besoin du tout dernier ID d’insertion, j’ai besoin du 10 000e dernier ID d’insertion (je suppose).

Quelqu’un peut-il me donner une bonne explication sur la pagination et le filtrage de manière rapide.

Les choses que j’utilise: – postgresql -pgadmin (pour la gestion de la base de données) – node.js (dernière version)

Merci à tous! Et bonne année 2020 !

EDIT 1: Je n’ai aucune idée, mais massiveJS (https://massivejs.org/) pourrait-il être quelque chose de bon à utiliser? Et dois-je l’utiliser sur TOUTES les requêtes, ou uniquement sur les requêtes de pagination?

MODIFIER 2: JE PENSE que je l’ai un peu compris (corrigez-moi si je me trompe).

Disons que j’ai 100 000 enregistrements:

1) Obtenez le dernier ID inséré

2) Utilisez ce dernier ID inséré pour récupérer les 10 000 derniers enregistrements

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) Afficher les 10 000 enregistrements mais également enregistrer l’ID d’insertion des 10 000 enregistrements à utiliser dans la requête suivante

4) Obtenez les 10 000 enregistrements suivants avec le nouveau dernier id d’insertion

SELECT * FROM output WHERE ID < 90000 ORDER BY ID DESC LIMIT 10000 // 90,000 is the very last insert id - 10,000

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.