Cas d'utilisation: une mesure crée un nombre donné d'images. Pour chaque image, nous devons stocker un petit ensemble d'indicateurs de qualité (flottants, doubles) avec un entier d'image [1 ... N], un horodatage et une ou deux valeurs de clé étrangère. Cela devrait ensuite être tracé en "temps réel" dans une application Web (PHP) pour que les utilisateurs l'évaluent.
Chaque client Web interroge la base de données toutes les 5 secondes. Le stockage + la récupération de chaque ensemble d'indicateurs de qualité devrait idéalement prendre moins de 2 secondes (environ). Dans le pire des cas, il peut y avoir ~ 30 interrogations simultanées de clients Web et environ 10 mesures peuvent être écrites simultanément, conduisant à des rafales d'écriture d'env. 1000 ensembles d'indicateurs de qualité par seconde.
Dans un langage de programmation, ce type de données serait probablement stocké dans des tableaux ou des listes. Comme je ne suis pas au courant de quelque chose de similaire dans le monde MariaDB/MySQL, j'utilise simplement une table InnoDB régulière avec une colonne pour chacune des valeurs mentionnées ci-dessus. Cela compte déjà plus de 90 millions de lignes et devrait croître plus rapidement dans les prochains mois.
InnoDB est-il globalement le meilleur moteur de stockage pour cela, ou devrais-je en considérer d'autres? Est-il recommandé d'archiver les données après un certain temps, peut-être une fois que toutes les images des mesures ont été traitées? Cela aiderait-il à activer la compression, ou cela aurait-il des impacts très négatifs sur les performances?
Avec juste MySQL/MariaDB, j'emploierais:
FOREIGN KEYS
en raison des frais généraux supplémentaires. (Au lieu de cela, je déboguerais le SQL.)AUTO_INCREMENT
si une ou plusieurs autres colonnes sont uniques.SPATIAL
est une approche; en voici un autre: http://mysql.rjweb.org/doc.php/latlngVotre dernier paragraphe jette dans l'évier de la cuisine des questions (Toku, MyRocks, archive, compression, table d'historique). Je suis surpris que la publication n'ait pas été tuée pour avoir été "trop large". Veuillez expliquer à quoi ressemblent vos données et vos requêtes; sinon, tout ce que nous pouvons faire, c'est jeter un évier de cuisine plein de solutions.
Vous dites "en temps réel", mais vous avez besoin de "milliers/sec". Pouvez-vous prévoir un délai d'une minute en temps réel? 1 seconde? Vous ne pouvez pas obtenir 1 ms; Les 1s seront difficiles à réaliser. Combien de temps dure une rafale? Qu'est-ce qu'une rafale par minute? 1K/sec se répandra probablement dans les prochaines secondes. 6K/minute n'est pas un problème.
Combien de clients stockent des données? Certaines solutions fonctionnent bien avec un seul client; différentes solutions sont nécessaires pour plusieurs clients.
Gardez à l'esprit que les repères sont réglés pour montrer une chose et correspondent rarement à la vie réelle.
Il y a là de grandes questions qui nécessitent probablement un examen plus approfondi que ce qui peut être réalisé ici, car il y a tellement de dépendances (réalisez que vous le savez!). Il existe un certain nombre de diapositives de présentations sur les pages Percona Live et Percona Live Europe sur les séries chronologiques qui pourraient vous aider à avancer plus loin. Par exemple, sur l'utilisation de ClickHouse de Yandex
https://www.percona.com/live/17/program/schedule/time-series
https://www.percona.com/live/e17/program-open-source-databases
Vous pourriez également trouver certains des articles de blog intéressants. Celui-ci examine TokuDB par rapport à InnoDB pour une référence de série chronologique.
https://www.percona.com/blog/2013/09/05/tokudb-vs-innodb-timeseries-insert-benchmark/
Alors que celui-ci regarde MongoDB et TokuMX https://www.percona.com/blog/2015/05/26/storing-time-series-data-with-mongodb-and-tokumx/
J'espère que ces aides.