Mysql
 sql >> Database >  >> RDS >> Mysql

La procedura memorizzata MySQL causa problemi?

C'è poco che puoi fare con questa query.

Prova questo:

  1. Crea una PRIMARY KEY su categoryIds (categoryId)

    • Assicurati che supplier (supplied_id) è una PRIMARY KEY

    • Assicurati che category_product (ProductID, CategoryID) (in questo ordine) è una PRIMARY KEY oppure hai un indice con ProductID 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