J'ai une table Postgres avec 500k lignes qui ne sont lues que (beaucoup, par plusieurs utilisateurs). Je me demandais si diviser la base de données en deux par, disons "date de naissance" des lignes, serait plus efficace.
J'ai la moitié du tableau qui sera beaucoup plus interrogé (date de naissance> 40). Donc, le diviser par date de naissance me permettrait de vérifier directement dans un sous-ensemble plus petit (en vérifiant simplement si mon élément est> 40). Cette méthode améliore-t-elle quelque chose?
3 Réponses :
Un index résout votre problème. Diviser une table en stockant différentes sections de celle-ci ne fait que compliquer les choses.
SiWM a raison. Ne divisez pas votre table, d'autant plus que 500k n'est pas vraiment un grand nombre par rapport à la norme actuelle. En plus de la suggestion de SiWM, je vous recommande de vérifier quelles colonnes se trouvent dans la clause WHERE lorsque la table est interrogée et de vous assurer qu'elles sont indexées.
Je comprends, mais il semble qu'à un moment donné, cela pourrait être une solution potentielle? À quelle taille dois-je commencer à penser à de telles choses et quelle est la théorie derrière cela? mise à l'échelle de SELECT en fonction de N?
Le point où ce serait une solution potentielle est le point où vous devriez quand même passer à un framework Big Data, tel qu'Apache Spark / Hadoop. D'après mon expérience personnelle, le point de rupture se situe autour de centaines de millions de lignes. La rangée de 500k est loin d'être proche. Ne pensez même pas à diviser manuellement les tables avant d'essayer postgresql.org/docs/ current / ddl-partitioning.html et ceci
Vous pouvez également regrouper la table en utilisant l'index principal utilisé (avec une tâche cron), en particulier si vous devez renvoyer plusieurs lignes à partir d'une seule requête.
https://www.postgresql.org/docs/9.1/sql-cluster.html
Initial configuration:
CLUSTER table_name
Re-cluster:
CLUSTER [VERBOSE] table_name [ USING index_name ]
Je suppose que vous voulez dire une «table», pas une base de données (une base de données contient plusieurs tables). Vous n'avez probablement besoin que d'un index pour prendre en charge vos requêtes. Diviser une si petite table ne sera pas nécessaire.
édité! mon mauvais merci! À quel moment ces mécanismes deviennent-ils pertinents?