Vous ne pouvez pas faire grand-chose avec cette requête.
Essayez ceci :
-
Créer une
PRIMARY KEYsurcategoryIds (categoryId)-
Assurez-vous que
supplier (supplied_id)est unePRIMARY KEY -
Assurez-vous que
category_product (ProductID, CategoryID)(dans cet ordre) est unePRIMARY KEY, ou vous avez un index avecProductIDmenant.
-
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