Mit dieser Abfrage können Sie wenig anfangen.
Versuchen Sie Folgendes:
-
Erstellen Sie einen
PRIMARY KEY
aufcategoryIds (categoryId)
-
Stellen Sie sicher, dass
supplier (supplied_id)
ist einPRIMARY KEY
-
Stellen Sie sicher, dass
category_product (ProductID, CategoryID)
(in dieser Reihenfolge) ist einPRIMARY KEY
, oder Sie haben einen Index mitProductID
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