Mysql
 sql >> база данни >  >> RDS >> Mysql

MySQL съхранената процедура причинява ли проблеми?

Малко можете да направите с тази заявка.

Опитайте това:

  1. Създайте PRIMARY KEY на categoryIds (categoryId)

    • Уверете се, че supplier (supplied_id) е PRIMARY KEY

    • Уверете се, че category_product (ProductID, CategoryID) (в този ред) е PRIMARY KEY , или имате индекс с ProductID водеща.

Актуализация:

Ако е INSERT което причинява проблема и product_search_query в MyISAM таблица проблемът може да бъде с MyISAM заключване.

MyISAM заключва цялата таблица, ако реши да вмъкне ред в свободен блок в средата на таблицата, което може да причини изчакване.

Опитайте да използвате INSERT DELAYED вместо това:

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

Това ще постави записите в опашката за вмъкване и ще се върне незабавно. Записът ще бъде добавен по-късно асинхронно.

Имайте предвид, че може да загубите информация, ако сървърът умре след издаване на командата, но преди действително вмъкването на записите.

Актуализация:

Тъй като вашата таблица е InnoDB , може да е проблем със заключването на масата. INSERT DELAYED не се поддържа в InnoDB .

В зависимост от естеството на заявката, DML заявки в InnoDB масата може да постави ключалки, които ще заключат вложките.

Например:

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

Тази заявка изпълнява ref сканира и поставя заключванията върху отделни записи:

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

Тази заявка, докато прави същото, изпълнява range сканира и поставя заключване на празнина след стойност на ключа 2 , което няма да позволи вмъкване на ключ стойност 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. Код на грешка:1822, когато типовете данни съвпадат, със съставен ключ

  2. Групиране на записи от цикъл while | PHP

  3. как да спестите само време без дата в базата данни чрез sql заявка

  4. ModuleNotFoundError:Няма модул с име 'mysql'

  5. Трябва ли да използвам NULL или празен низ, за ​​да представя никакви данни в колоната на таблицата?