C'è poco che puoi fare con questa query.
Prova questo:
-
Crea una
PRIMARY KEYsucategoryIds (categoryId)-
Assicurati che
supplier (supplied_id)è unaPRIMARY KEY -
Assicurati che
category_product (ProductID, CategoryID)(in questo ordine) è unaPRIMARY KEYoppure hai un indice conProductIDin 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