sql >> Database teknologi >  >> RDS >> Mysql

MySQL lagret procedure forårsager problemer?

Der er lidt du kan gøre med denne forespørgsel.

Prøv dette:

  1. Opret en PRIMARY KEYcategoryIds (categoryId)

    • Sørg for, at supplier (supplied_id) er en PRIMARY KEY

    • Sørg for, at category_product (ProductID, CategoryID) (i denne rækkefølge) er en PRIMARY KEY , eller du har et indeks med ProductID 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


  1. Trigger Insert med en SELECT/JOIN

  2. Vinder af PHP-lotterisedler

  3. Kan ikke oprette forbindelse til MySQL fra Java:NullPointerException inde i MySQL-driverforbindelseslogikken

  4. MySQL-forespørgsel - få poster baseret på nuværende dato