sql >> Base de Datos >  >> RDS >> Mysql

¿El procedimiento almacenado de MySQL está causando problemas?

Es poco lo que puede hacer con esta consulta.

Prueba esto:

  1. Crear una PRIMARY KEY en categoryIds (categoryId)

    • Asegúrese de que supplier (supplied_id) es una PRIMARY KEY

    • Asegúrese de que category_product (ProductID, CategoryID) (en este orden) es una PRIMARY KEY , o tiene un índice con ProductID 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