Es poco lo que puede hacer con esta consulta.
Prueba esto:
-
Crear una
PRIMARY KEYencategoryIds (categoryId)-
Asegúrese de que
supplier (supplied_id)es unaPRIMARY KEY -
Asegúrese de que
category_product (ProductID, CategoryID)(en este orden) es unaPRIMARY KEY, o tiene un índice conProductIDlíder.
-
Actualización:
Si es INSERT que causa el problema y product_search_query en un MyISAM table el problema puede ser con MyISAM bloqueo.
MyISAM bloquea toda la tabla si decide insertar una fila en un bloque libre en el medio de la tabla, lo que puede causar tiempos de espera.
Intenta usar INSERT DELAYED en cambio:
IF @resultsFound > 0 THEN
INSERT DELAYED INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
Esto pondrá los registros en la cola de inserción y regresará inmediatamente. El registro se agregará más tarde de forma asíncrona.
Tenga en cuenta que puede perder información si el servidor muere después de emitir el comando pero antes de que se inserten los registros.
Actualización:
Dado que su tabla es InnoDB , puede ser un problema con el bloqueo de la tabla. INSERT DELAYED no es compatible con InnoDB .
Dependiendo de la naturaleza de la consulta, DML consultas en InnoDB la mesa puede colocar bloqueos de espacio que bloquearán los insertos.
Por ejemplo:
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);
Esta consulta realiza ref escanea y coloca los bloqueos en registros individuales:
-- 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
Esta consulta, mientras hace lo mismo, realiza un range escanea y coloca un bloqueo de espacio después del valor clave 2 , que no permitirá insertar el valor clave 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