Малко можете да направите с тази заявка.
Опитайте това:
-
Създайте
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