Question

J'ai écrit une procédure stockée dans MySQL pour prendre des valeurs actuellement dans une table et de « Normaliser » eux. Cela signifie que pour chaque valeur passée à la procédure stockée, il vérifie si la valeur est déjà dans la table. Le cas échéant, il stocke l'identifiant de cette ligne dans une variable. Si la valeur est pas dans le tableau, il stocke l'identifiant de la nouvelle valeur insérée. La procédure stockée prend alors le sont eux id et insère dans une table qui équivaut à l'original table de-normailized, mais ce tableau est entièrement normalisé et se compose de clés principalement étrangères.

Mon problème avec cette conception est que la procédure stockée prend environ 10 ms environ pour le retour, ce qui est trop long quand vous essayez de travailler dans certains dossiers de 10millions. Je soupçonne que la performance est de faire de la façon dont je fais les inserts. i.e..

INSERT INTO TableA 
 (first_value) 
VALUES 
 (argument_from_sp) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id);

SET @TableAId = LAST_INSERT_ID();

Le « Duplicate KEY UPDATE » est un peu un hack, en raison du fait que sur une clé en double, je ne veux pas quoi que ce soit de mise à jour mais juste retour l'identifiant de la ligne. Si vous manquez cette étape cependant, le retour de la fonction LAST_INSERT_ID () la mauvaise valeur lorsque vous essayez d'exécuter l'instruction « SET ... ».

Quelqu'un sait-il d'une meilleure façon de le faire dans MySQL?

Était-ce utile?

La solution

J'ai de nouveau disparu et créé une fonction pour gérer ce cas au lieu:

CREATE DEFINER=`root`@`%` FUNCTION `value_update`(inValue VARCHAR(255)) RETURNS int(11)
BEGIN
        DECLARE outId INT;
        SELECT valueId INTO outId FROM ValuesTable WHERE value = inValue;

        IF outId IS NULL THEN
                INSERT INTO ValuesTable (value) VALUES (inValue);
                SELECT LAST_INSERT_ID() INTO outId;
        END IF;

        RETURN outId;
END

La procédure stockée mentionné précédemment appelle ces fonctions au lieu de faire les déclarations INSERT lui-même. Côté performance, la fonction ci-dessus est plus rapide dans ma configuration (en utilisant le type de table NDB). En outre, après l'analyse comparative de toutes les parties de mon application, j'ai trouvé que les problèmes de performance cela a été à l'origine ne constituaient qu'une partie mineure du goulot d'étranglement de la performance globale.

Autres conseils

Si vous avez déjà un identifiant unique, est-il nécessaire d'avoir une clé primaire auto-incrémentée?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top