Une meilleure façon de stocker/interroger une arborescence spécifique dans SQL?
Nous avons obtenu ce modèle de données. Connaissant la profondeur d'arbre limitée, nos tables actuelles sont 1: 1 au modèle, avec des clés étrangères au nœud parent. Channel
à Station
, Measurement
à Channel
et Station
. 90% des requêtes est:
select value from measurements where
fk_station=X and fk_channel=Y and timestamp>=A and timestamp<=B
order by timestamp asc
Le reste 10% est similaire sur les autres tables horodatés, seulement plus simple en raison du manque fk_channel
.
problème auquel nous sommes confrontés: il y a des centaines de millions de [station,channel,timestamp]
uniques lignes Measurement
table et de plus en plus. L'index d'horodatage était déjà si énorme et la clause d'ordonnancement si lente que nous devions commencer à la diviser par Station Id; nous avons donc les tables Measurement_<Station Id>
et la clé étrangère Station
est omise. Cela a beaucoup aidé, mais certaines tables ont quand même des dizaines de millions de lignes. Dans les pics de charge, nous avons environ 80000 requêtes/minute et les requêtes sur ces plus grandes tables sont remarquablement plus paresseuses. Nous courons toujours à partir d'une instance MySQL/ISAM sans aucun hacks d'optimisation. Environ 150 Go sur le système de fichiers.
- Y a-t-il une manière significativement différente/meilleure de stocker un tel modèle de données?
- Avec la structure actuelle, est-il normal que nous ayons ce genre de problèmes de performances avec cette taille/charge? La machine est la moyenne hw d'aujourd'hui, aucun atome incorporé ni bête de noyau 8+
- était la bonne chose à faire la division de
Measurement
table? Nous ne sommes pas des gourous SQL, mais la requête et l'index requis semblaient si évidents que nous n'avons même pas envisagé de l'optimiser. Le fractionnement a beaucoup aidé, mais quelque chose d'autre pourrait aussi y avoir - Y at-il un autre moyen d'accélérer l'index? C'est un peu stupide que nous devons faire le même index en continuant à faire des sous-ensembles du même résultat. Nous n'utiliserons jamais aucune autre indexation, même pas le
desc
. C'est un appareil très spécialisé. Serait bien si l'index est en quelque sorte "ordre natif" :-) - serait-il aider à distribuer/partitionner les tables divisées
Measurement
? Comme je l'ai dit, quelques tables sont encore énormes et le problème se sent à environ la taille de l'index dont la distribution ne va pas aider, alors peut-être tout simplement réduire la charge de requête ...
1. L'agrégation n'est pas une option, nous avons besoin de toutes ces données. La seule alternative serait d'implémenter une sorte de sous-échantillonnage dans une procédure stockée, ce qui est bien au-delà de ce que nous voulons jeter au problème. –
2. La requête renvoie max de l'ordre de 10000 lignes. Tout est alimenté tel quel par le paquet graphique de frontend - qui fait la décimation mentionnée dans la puce 1. Mais je suis vraiment intéressé par le «tri par ID» - nous pouvons imaginer le post-tri au frontend. Cela signifie-t-il que nous n'aurons pas besoin de l'index même pour la sélection de la plage d'horodatage [A, B]? –
"Les moteurs db relationnels ne sont pas bons pour trier d'énormes mandrins de données" des nouvelles surprenantes pour moi (SQL gourou je ne suis pas). Pouvez-vous m'indiquer une lecture éclairante à ce sujet? –