Vous ne pouvez pas faire grand-chose avec cette requête.
Essayez ceci :
-
Créer une
PRIMARY KEY
surcategoryIds (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 avecProductID
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