Contexte
Une base de données locale contient près de 1,3 milliard de lignes uniques. Chaque ligne est indirectement associée à une latitude et une longitude spécifiques (emplacement). Chaque ligne a un timbre à date.
Cas d'utilisation
Le problème est le suivant:
- L'utilisateur définit une date de début / fin et une plage de valeurs (par exemple, 100 à 105).
- Le système rassemble toutes les lignes qui correspondent à la date donnée, regroupées par emplacement.
- Le système détermine les emplacements qui, pendant ces dates, ont une probabilité statistique de tomber dans la plage de valeurs donnée.
- Le système affiche tous les emplacements correspondants à l'utilisateur.
C'est un problème de vitesse et d'échelle.
Question
Quelle est l'architecture de solution la moins chère que vous pouvez imaginer qui permettrait à un tel système de récupérer des résultats pour les utilisateurs en moins de cinq secondes?
Système actuel
L'environnement est actuellement:
- PostgreSQL 8.4 (la mise à niveau est possible; le changement de base de données n'est pas une option)
- R et PL / R
- XFS
- WD VelociRaptor
- 8 Go de RAM (Corsair G.Skill; 1,3 GHz)
- Quad core Genuine Intel 7 (2,8 GHz)
- Ubuntu 10.10
Les mises à niveau matérielles sont acceptables.
Mise à jour - Structure de la base de données
Les milliards de lignes sont dans un tableau ressemblant à:
id | taken | location_id | category | value1 | value2 | value3
- id - Clé primaire
- prise - Date affectée à la ligne
- location_id - Référence à la latitude / longitude
- catégorie - Une description des données
- value1 .. 3 - Les autres valeurs que l'utilisateur peut interroger
La taken
colonne est généralement des dates consécutives par location_id
, parfois chaque emplacement a des données de 1800 à 2010 (environ 77 000 dates, beaucoup d'entre elles étant dupliquées car chaque emplacement a des données dans la même plage de dates).
Il existe sept catégories et les tableaux sont déjà divisés par catégorie (en utilisant des tableaux enfants). Chaque catégorie contient environ 190 millions de lignes. Dans un avenir proche, le nombre de lignes par catégorie dépassera le milliard.
Il y a environ 20 000 emplacements et 70 000 villes. Les emplacements sont corrélés à la ville par la latitude et la longitude. Attribuer chaque emplacement à une ville particulière signifie trouver les limites de la ville, ce qui n'est pas une tâche triviale.
Des idées
Voici quelques idées que j'ai:
- Trouvez un service cloud pour héberger la base de données.
- Créez une bande de raid SSD (superbe vidéo).
- Créez un tableau qui regroupe tous les emplacements par ville (pré-calcul).
Je vous remercie!