sql >> Databáze >  >> RDS >> Mysql

Způsobuje problémy uložené procedury MySQL?

S tímto dotazem můžete udělat jen málo.

Zkuste toto:

  1. Vytvořte PRIMARY KEY na categoryIds (categoryId)

    • Ujistěte se, že supplier (supplied_id) je PRIMARY KEY

    • Ujistěte se, že category_product (ProductID, CategoryID) (v tomto pořadí) je PRIMARY KEY nebo máte index s ProductID 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


  1. vyberte součet do určité částky a poté aktualizujte určitá pole na základě podmínky

  2. Konvence pojmenování PostgreSQL

  3. Jak funguje SYS_GUID() v MariaDB

  4. Zvýšení uložené procedury není kompatibilní s sql_mode=only_full_group_by, přestože je sql_mode prázdný