C'è poco che puoi fare con questa query.
Prova questo:
-
Crea una
PRIMARY KEY
sucategoryIds (categoryId)
-
Assicurati che
supplier (supplied_id)
è unaPRIMARY KEY
-
Assicurati che
category_product (ProductID, CategoryID)
(in questo ordine) è unaPRIMARY KEY
oppure hai un indice conProductID
in testa.
-
Aggiornamento:
Se è INSERT
che causa il problema e product_search_query
in un MyISAM
tabella il problema può essere con MyISAM
blocco.
MyISAM
blocca l'intera tabella se decide di inserire una riga in un blocco libero al centro della tabella che può causare i timeout.
Prova a utilizzare INSERT DELAYED
invece:
IF @resultsFound > 0 THEN
INSERT DELAYED INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
Ciò metterà i record nella coda di inserimento e restituirà immediatamente. Il record verrà aggiunto in seguito in modo asincrono.
Tieni presente che potresti perdere informazioni se il server si interrompe dopo l'emissione del comando ma prima che i record vengano effettivamente inseriti.
Aggiornamento:
Poiché la tua tabella è InnoDB
, potrebbe trattarsi di un problema con il blocco della tabella. INSERT DELAYED
non è supportato su InnoDB
.
A seconda della natura della query, DML
query su InnoDB
il tavolo può posizionare blocchi di spazio che bloccheranno gli inserti.
Ad esempio:
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);
Questa query esegue ref
scansiona e posiziona i blocchi sui singoli record:
-- 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
Questa query, pur facendo lo stesso, esegue un range
scansiona e posiziona un lucchetto dopo il valore della chiave 2
, che non consentirà di inserire il valore chiave 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