J'essaie actuellement d'améliorer les performances d'une application web. Le but de l'application est de fournir (real time) analytics
. Nous avons un modèle de base de données semblable à un star schema
, peu de tables de faits et de nombreuses tables dimensionnelles. La base de données fonctionne avec le moteur Mysql
et le moteur MyIsam
.
La taille de la table Fact peut facilement atteindre les millions supérieurs et certaines tables de dimension peuvent également atteindre les millions.
Maintenant, le point est que les requêtes select peuvent être terriblement lentes si les tables de dimension sont jointes sur les tables de faits et que les agrégation sont effectuées. La première chose qui vient à l'esprit en entendant cela est, pourquoi ne pas précalculer les données? Cela n'est pas possible car les utilisateurs sont autorisés à utiliser plusieurs filtres librement personnalisables.Mixage de bases de données orientées colonnes et lignes?
Donc, ce dont j'ai besoin est un système tout-en-un adapté à tous les usages;) Malheureusement, il n'a pas encore été inventé. J'ai donc eu l'idée de combiner 2 systèmes existants. Mélanger un row oriented
et une base de données column oriented
(par exemple, comme infinidb
ou infobright
). Conserver la solution mysql MyIsam (pour les insertions rapides et les requêtes par ligne) et ajouter une base de données orientée colonne (pour les opérations d'agrégation rapide sur quelques colonnes) et la remplir périodiquement (tous les soirs) via cronjob. Le problème serait lorsque les données actuelles (il doit être en temps réel) sont interrogées, donc je devrais peut-être obtenir des données des deux bases de données qui peuvent compliquer les choses.
Les premiers tests avec infinidb ont montré de très bonnes performances sur l'agrégation de quelques colonnes, donc je pense vraiment que cela pourrait m'aider à accélérer l'application. Donc, la question est: est-ce une bonne idée? Est-ce que quelqu'un a peut-être déjà fait ça? Peut-être qu'il y a de meilleures façons de le faire.
Je n'ai pas encore d'expérience dans les bases de données orientées colonnes et je ne sais pas non plus comment le schéma devrait ressembler. Les premiers tests ont montré de bonnes performances sur la même structure star schema like
mais également dans une structure big table like
.
J'espère que cette question correspond à SO.
Il suffit de changer votre moteur pour innodb http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html. J'exporterais probablement les données dans des fichiers csv triés par clé primaire, recréerais le schéma en utilisant innodb puis rechargerais les données triées. –
Merci, oui nous envisageons aussi de passer à innodb, notamment à cause des massives lectures/écritures parallèles. J'ai aussi testé un peu avec innodb qui a donné de bons résultats, notamment sur les lectures/écritures simultanées. Mais pas vraiment les performances nécessaires augmentent comme avec les bases de données orientées colonne, qui ont effectué environ 25 +% de mieux sur certaines opérations. – enricog
étrange - j'ai observé le contraire - peut-être vous avez besoin de refaire votre schéma pour profiter de l'index clusterisé d'innodb http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql- index-optimizations/ –