S tímto dotazem můžete udělat jen málo.
Zkuste toto:
-
Vytvořte
PRIMARY KEY
nacategoryIds (categoryId)
-
Ujistěte se, že
supplier (supplied_id)
jePRIMARY KEY
-
Ujistěte se, že
category_product (ProductID, CategoryID)
(v tomto pořadí) jePRIMARY KEY
nebo máte index sProductID
vedoucí.
-
Aktualizace:
Pokud je to INSERT
který způsobuje problém a product_search_query
v MyISAM
tabulka problém může být s MyISAM
zamykání.
MyISAM
uzamkne celou tabulku, pokud se rozhodne vložit řádek do volného bloku uprostřed tabulky, což může způsobit vypršení časového limitu.
Zkuste použít INSERT DELAYED
místo toho:
IF @resultsFound > 0 THEN
INSERT DELAYED INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
Tím se záznamy zařadí do fronty pro vložení a okamžitě se vrátí. Záznam bude přidán později asynchronně.
Všimněte si, že můžete ztratit informace, pokud server zanikne po vydání příkazu, ale před skutečným vložením záznamů.
Aktualizace:
Protože vaše tabulka je InnoDB
, může to být problém se zamykáním stolu. INSERT DELAYED
není podporován na InnoDB
.
V závislosti na povaze dotazu DML
dotazy na InnoDB
stůl může umístit zámky mezer, které zamknou vložky.
Například:
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);
Tento dotaz provede ref
skenuje a umísťuje zámky na jednotlivé záznamy:
-- 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
Tento dotaz, zatímco dělá totéž, provádí range
naskenujte a umístí zámek mezery za hodnotu klíče 2
, což nedovolí vložit hodnotu klíče 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