Mysql
 sql >> Base de données >  >> RDS >> Mysql

Procédure stockée MySQL causant des problèmes?

Vous ne pouvez pas faire grand-chose avec cette requête.

Essayez ceci :

  1. Créer une PRIMARY KEY sur categoryIds (categoryId)

    • Assurez-vous que supplier (supplied_id) est une PRIMARY KEY

    • Assurez-vous que category_product (ProductID, CategoryID) (dans cet ordre) est une PRIMARY KEY , ou vous avez un index avec ProductID menant.

Mise à jour :

Si c'est INSERT qui cause le problème et product_search_query dans un MyISAM table le problème peut être avec MyISAM verrouillage.

MyISAM verrouille toute la table s'il décide d'insérer une ligne dans un bloc libre au milieu de la table ce qui peut provoquer des timeouts.

Essayez d'utiliser INSERT DELAYED à la place :

IF @resultsFound > 0 THEN
    INSERT DELAYED INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;

Cela mettra les enregistrements dans la file d'attente d'insertion et reviendra immédiatement. L'enregistrement sera ajouté ultérieurement de manière asynchrone.

Notez que vous risquez de perdre des informations si le serveur meurt après l'émission de la commande mais avant que les enregistrements ne soient réellement insérés.

Mise à jour :

Puisque votre table est InnoDB , il peut s'agir d'un problème de verrouillage de table. INSERT DELAYED n'est pas pris en charge sur InnoDB .

Selon la nature de la requête, DML requêtes sur InnoDB table peut placer des verrous d'écart qui verrouillent les inserts.

Par exemple :

CREATE TABLE t_lock (id INT NOT NULL PRIMARY KEY, val INT NOT NULL) ENGINE=InnoDB;
INSERT
INTO    t_lock
VALUES
        (1, 1),
        (2, 2);

Cette requête effectue ref scanne et place les verrous sur les enregistrements individuels :

-- Session 1
START TRANSACTION;
UPDATE  t_lock
SET     val = 3
WHERE   id IN (1, 2)

-- Session 2
START TRANSACTION;
INSERT
INTO    t_lock 
VALUES  (3, 3)
-- Success

Cette requête, tout en faisant la même chose, effectue une range numérise et place un verrou d'espacement après la valeur de clé 2 , qui ne laissera pas insérer la valeur de clé 3 :

-- Session 1
START TRANSACTION;
UPDATE  t_lock
SET     val = 3
WHERE   id BETWEEN 1 AND 2

-- Session 2
START TRANSACTION;
INSERT
INTO    t_lock 
VALUES  (3, 3)
-- Locks