Es poco lo que puede hacer con esta consulta.
Prueba esto:
-
Crear una
PRIMARY KEY
encategoryIds (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 conProductID
lí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