Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gespeicherte MySQL-Prozedur verursacht Probleme?

Mit dieser Abfrage können Sie wenig anfangen.

Versuchen Sie Folgendes:

  1. Erstellen Sie einen PRIMARY KEY auf categoryIds (categoryId)

    • Stellen Sie sicher, dass supplier (supplied_id) ist ein PRIMARY KEY

    • Stellen Sie sicher, dass category_product (ProductID, CategoryID) (in dieser Reihenfolge) ist ein PRIMARY KEY , oder Sie haben einen Index mit ProductID führend.

Aktualisierung:

Wenn es INSERT ist das verursacht das Problem und product_search_query in einem MyISAM Tabelle kann das Problem bei MyISAM liegen sperren.

MyISAM sperrt die gesamte Tabelle, wenn es beschließt, eine Zeile in einen freien Block in der Mitte der Tabelle einzufügen, was zu Timeouts führen kann.

Versuchen Sie es mit INSERT DELAYED stattdessen:

IF @resultsFound > 0 THEN
    INSERT DELAYED INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;

Dadurch werden die Datensätze in die Einfügewarteschlange gestellt und sofort zurückgegeben. Der Datensatz wird später asynchron hinzugefügt.

Beachten Sie, dass Sie Informationen verlieren können, wenn der Server nach Ausgabe des Befehls, aber bevor die Datensätze tatsächlich eingefügt werden, abstürzt.

Aktualisierung:

Da Ihre Tabelle InnoDB ist , kann es sich um ein Problem mit der Tabellensperre handeln. INSERT DELAYED wird auf InnoDB nicht unterstützt .

Abhängig von der Art der Abfrage, DML Abfragen auf InnoDB Der Tisch kann Lückensperren anbringen, die die Einsätze verriegeln.

Zum Beispiel:

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);

Diese Abfrage führt ref aus scannt und sperrt einzelne Datensätze:

-- 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

Diese Abfrage führt, während sie dasselbe tut, einen range aus scan und platziert eine Lückensperre nach dem Schlüsselwert 2 , wodurch der Schlüsselwert 3 nicht eingefügt werden kann :

-- 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