Mit dieser Abfrage können Sie wenig anfangen.
Versuchen Sie Folgendes:
-
Erstellen Sie einen
PRIMARY KEYaufcategoryIds (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 mitProductIDfü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