Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Procedura składowana MySQL powodująca problemy?

Z tym zapytaniem niewiele można zrobić.

Spróbuj tego:

  1. Utwórz PRIMARY KEY na categoryIds (categoryId)

    • Upewnij się, że supplier (supplied_id) to PRIMARY KEY

    • Upewnij się, że category_product (ProductID, CategoryID) (w tej kolejności) to PRIMARY KEY lub masz indeks z ProductID wiodący.

Aktualizacja:

Jeśli to INSERT który powoduje problem i product_search_query w MyISAM tabela problem może dotyczyć MyISAM blokowanie.

MyISAM blokuje całą tabelę, jeśli zdecyduje się wstawić wiersz do wolnego bloku na środku tabeli, co może spowodować przekroczenie limitu czasu.

Spróbuj użyć INSERT DELAYED zamiast tego:

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

Spowoduje to umieszczenie rekordów w kolejce wstawiania i natychmiastowe zwrócenie. Rekord zostanie dodany później asynchronicznie.

Pamiętaj, że możesz utracić informacje, jeśli serwer umrze po wydaniu polecenia, ale przed faktycznym wstawieniem rekordów.

Aktualizacja:

Ponieważ twoja tabela to InnoDB , może to być problem z blokowaniem tabeli. INSERT DELAYED nie jest obsługiwany w InnoDB .

W zależności od charakteru zapytania DML zapytania w InnoDB stół może umieścić blokady szczelin, które zablokują wkładki.

Na przykład:

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

To zapytanie wykonuje ref skanuje i umieszcza blokady na poszczególnych rekordach:

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

To zapytanie, wykonując to samo, wykonuje range skanuje i umieszcza lukę po wartości klucza 2 , co nie pozwoli wstawić wartości klucza 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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sugestie dotyczące tworzenia kopii zapasowych strony php i mysql db

  2. Zapisz błąd w bazie danych MySQL

  3. Jak podłączyć bazę danych Presto do MySQL

  4. Usuń zduplikowane rekordy z tabeli bez pk lub id lub unikalnych kolumn w mysql

  5. pobrać i wydrukować wartości po przecinku z pojedynczego pola za pomocą złączenia (codeigniter)