Der er lidt du kan gøre med denne forespørgsel.
Prøv dette:
-
Opret en
PRIMARY KEY
påcategoryIds (categoryId)
-
Sørg for, at
supplier (supplied_id)
er enPRIMARY KEY
-
Sørg for, at
category_product (ProductID, CategoryID)
(i denne rækkefølge) er enPRIMARY KEY
, eller du har et indeks medProductID
førende.
-
Opdatering:
Hvis det er INSERT
der forårsager problemet og product_search_query
i en MyISAM
tabel kan problemet være med MyISAM
låsning.
MyISAM
låser hele bordet, hvis det beslutter sig for at indsætte en række i en ledig blok i midten af bordet, hvilket kan forårsage timeouts.
Prøv at bruge INSERT DELAYED
i stedet:
IF @resultsFound > 0 THEN
INSERT DELAYED INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
Dette vil sætte posterne i indsættelseskøen og returnere med det samme. Posten tilføjes senere asynkront.
Bemærk, at du kan miste information, hvis serveren dør efter kommandoen er udstedt, men før posterne rent faktisk er indsat.
Opdatering:
Da din tabel er InnoDB
, kan det være et problem med bordlåsning. INSERT DELAYED
er ikke understøttet på InnoDB
.
Afhængigt af arten af forespørgslen, DML
forespørgsler på InnoDB
bordet kan placere mellemrumslåse, som vil låse indsatserne.
For eksempel:
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);
Denne forespørgsel udfører ref
scanner og placerer låsene på individuelle poster:
-- 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
Denne forespørgsel udfører, mens den gør det samme, et range
scan og placerer en mellemrumslås efter nøgleværdien 2
, som ikke tillader indsættelse af nøgleværdi 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