Z tym zapytaniem niewiele można zrobić.
Spróbuj tego:
-
Utwórz
PRIMARY KEYnacategoryIds (categoryId)-
Upewnij się, że
supplier (supplied_id)toPRIMARY KEY -
Upewnij się, że
category_product (ProductID, CategoryID)(w tej kolejności) toPRIMARY KEYlub masz indeks zProductIDwiodą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