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