sql >> Database >  >> RDS >> Mysql

MySQL-opgeslagen procedure die problemen veroorzaakt?

U kunt met deze vraag weinig doen.

Probeer dit:

  1. Maak een PRIMARY KEY op categoryIds (categoryId)

    • Zorg ervoor dat supplier (supplied_id) is een PRIMARY KEY

    • Zorg ervoor dat category_product (ProductID, CategoryID) (in deze volgorde) is een PRIMARY KEY , of je hebt een index met ProductID leidend.

Bijwerken:

Als het INSERT . is dat het probleem veroorzaakt en product_search_query in een MyISAM tabel kan het probleem zijn met MyISAM vergrendelen.

MyISAM vergrendelt de hele tafel als het besluit een rij in een vrij blok in het midden van de tafel in te voegen, wat de time-outs kan veroorzaken.

Probeer INSERT DELAYED in plaats daarvan:

IF @resultsFound > 0 THEN
    INSERT DELAYED INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;

Hierdoor worden de records in de invoegwachtrij geplaatst en onmiddellijk teruggestuurd. Het record wordt later asynchroon toegevoegd.

Houd er rekening mee dat u informatie kunt verliezen als de server uitvalt nadat de opdracht is gegeven, maar voordat de records daadwerkelijk zijn ingevoegd.

Bijwerken:

Aangezien uw tabel InnoDB . is , kan het een probleem zijn met tafelvergrendeling. INSERT DELAYED wordt niet ondersteund op InnoDB .

Afhankelijk van de aard van de zoekopdracht, DML vragen op InnoDB tafel kan spleetvergrendelingen plaatsen die de inzetstukken vergrendelen.

Bijvoorbeeld:

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);

Deze zoekopdracht voert ref uit scant en plaatst de sloten op individuele records:

-- 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

Deze query voert, terwijl hij hetzelfde doet, een range . uit scan en plaatst een gap lock na sleutelwaarde 2 , waardoor de sleutelwaarde 3 . niet kan worden ingevoegd :

-- 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. Hoe een Oracle-opgeslagen procedure uit te voeren via een databasekoppeling

  2. Pagina-einde in Html2Pdf

  3. MySQL DROP-INDEX

  4. Hoe TIMESTAMPDIFF() werkt in MariaDB