J'utilise et je travaille sur un logiciel qui utilise MySQL comme moteur backend (il peut utiliser d'autres moteurs tels que PostgreSQL ou Oracle ou SQLite, mais c'est l'application principale que nous utilisons). Le logiciel a été la conception de telle sorte que les données binaires que nous voulons accéder est maintenu comme BLOBs dans les colonnes individuelles (chaque table a un blob colonne, les autres colonnes ont des nombres entiers/flotteurs pour caractériser la blob, et une chaîne colonne avec le hachage MD5 BLOB). Les tables ont généralement 2, 3 ou 4 index, dont l'un est toujours la colonne MD5, qui est faite UNIQUE
. Certaines tables ont déjà des millions d'entrées, et elles ont atteint la taille de plusieurs gigaoctets. Nous conservons des bases de données MySQL séparées par an dans le même serveur (jusqu'à présent). Le matériel est assez raisonnable (je pense) pour les applications générales (un serveur Dell PowerEdge 2U-form).Slow MySQL insère
Les requêtes MySQL SELECT
sont relativement rapides. Il y a peu de plaintes là-bas, car ce sont (la plupart du temps) en mode batch. Cependant, les requêtes INSERT
prennent beaucoup de temps, ce qui augmente avec la taille de la table (nombre de lignes). Certes, c'est parce que la colonne MD5 est de type UNIQUE
et que chaque INSERT
doit déterminer si chaque nouvelle ligne a une chaîne MD5 déjà insérée. Et ce n'est pas trop étrange (je pense) si la performance s'aggrave s'il y a d'autres index (pas uniques). Mais je ne peux toujours pas me reposer que ce choix d'architecture logicielle (je suspecte garder BLOBs dans la rangée de table au lieu de disque a un impact négatif significatif) n'est pas le meilleur choix. Les insertions ne sont pas critiques, mais c'est un sentiment ennuyeux à avoir.
Est-ce que quelqu'un a de l'expérience dans des situations similaires? Avec MySQL, ou même d'autres RDBMes (de préférence Linux)? Toutes les idées que vous souhaitez fournir, peut-être quelques chiffres de performance? Par ailleurs, la langue de travail est C++ (qui enveloppe les appels C à l'API de MySQL).
Le choix BEGIN TRANSACTION semble la solution la plus simple en ce moment. Cependant j'ai quelques questions, puisque je ne suis pas familier avec lui (je maintiendrai RTFM pendant ce temps). 1) Puisque l'API de MySQL est en C, il peut arriver que nous fassions des erreurs et essayons d'insérer des VALEURS qui pointent vers NULL. Cela entraînera presque certainement la mort de l'application cliente avec SEGFAULT. La transaction sera-t-elle "sale" dans ce cas? Besoin de nettoyer? Comment? 2) Nous utilisons MyISAM. Passer à InnoDB maintenant peut être douloureux et/ou dangereux. Connaissez-vous les performances de TRANSACTION sur MyISAM? Merci d'avance pour vos commentaires. – jbatista
MhISAM n'est pas transactionnel, cela signifie que vous pouvez ignorer tout ce que j'ai écrit sur les transactions, mais l'instruction insert avec plusieurs centaines ou milliers d'insertions dans une requête accélérera également les choses dans MyISAM. – dimus
OK. Savez-vous si la syntaxe INSERT INTO impose une limite à la longueur de la chaîne de requête? I.o.w., MySQL accepte-t-il une chaîne de requête INSERT INTO avec une longueur de (par exemple) des centaines de millions de caractères? Ça sent comme des ennuis pour moi. – jbatista