S tímto dotazem můžete udělat jen málo.
Zkuste toto:
-
Vytvořte
PRIMARY KEYnacategoryIds (categoryId)-
Ujistěte se, že
supplier (supplied_id)jePRIMARY KEY -
Ujistěte se, že
category_product (ProductID, CategoryID)(v tomto pořadí) jePRIMARY KEYnebo máte index sProductIDvedoucí.
-
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