Z tym zapytaniem niewiele można zrobić.
Spróbuj tego:
-
Utwórz
PRIMARY KEY
nacategoryIds (categoryId)
-
Upewnij się, że
supplier (supplied_id)
toPRIMARY KEY
-
Upewnij się, że
category_product (ProductID, CategoryID)
(w tej kolejności) toPRIMARY KEY
lub masz indeks zProductID
wiodący.
-
Aktualizacja:
Jeśli to INSERT
który powoduje problem i product_search_query
w MyISAM
tabela problem może dotyczyć MyISAM
blokowanie.
MyISAM
blokuje całą tabelę, jeśli zdecyduje się wstawić wiersz do wolnego bloku na środku tabeli, co może spowodować przekroczenie limitu czasu.
Spróbuj użyć INSERT DELAYED
zamiast tego:
IF @resultsFound > 0 THEN
INSERT DELAYED INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
Spowoduje to umieszczenie rekordów w kolejce wstawiania i natychmiastowe zwrócenie. Rekord zostanie dodany później asynchronicznie.
Pamiętaj, że możesz utracić informacje, jeśli serwer umrze po wydaniu polecenia, ale przed faktycznym wstawieniem rekordów.
Aktualizacja:
Ponieważ twoja tabela to InnoDB
, może to być problem z blokowaniem tabeli. INSERT DELAYED
nie jest obsługiwany w InnoDB
.
W zależności od charakteru zapytania DML
zapytania w InnoDB
stół może umieścić blokady szczelin, które zablokują wkładki.
Na przykład:
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);
To zapytanie wykonuje ref
skanuje i umieszcza blokady na poszczególnych rekordach:
-- 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
To zapytanie, wykonując to samo, wykonuje range
skanuje i umieszcza lukę po wartości klucza 2
, co nie pozwoli wstawić wartości klucza 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