Há pouco que você pode fazer com esta consulta.
Tente isto:
-
Crie umaPRIMARY KEYemcategoryIds (categoryId)
-
Certifique-se de quesupplier (supplied_id)é umaPRIMARY KEY
-
Certifique-se de quecategory_product (ProductID, CategoryID)(nesta ordem) é umaPRIMARY KEY, ou você tem um índice comProductIDconduzindo.
-
Atualização:
Se for
INSERT que causa o problema e product_search_query em um MyISAM table o problema pode ser com MyISAM travamento. MyISAM bloqueia a tabela inteira se decidir inserir uma linha em um bloco livre no meio da tabela, o que pode causar timeouts. Tente usar
INSERT DELAYED em vez de:IF @resultsFound > 0 THEN
INSERT DELAYED INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
Isso colocará os registros na fila de inserção e retornará imediatamente. O registro será adicionado posteriormente de forma assíncrona.
Observe que você pode perder informações se o servidor morrer depois que o comando for emitido, mas antes que os registros sejam realmente inseridos.
Atualização:
Como sua tabela é
InnoDB , pode ser um problema com o bloqueio da tabela. INSERT DELAYED não é suportado em InnoDB . Dependendo da natureza da consulta,
DML consultas no InnoDB mesa pode colocar travas de folga que travarão as inserções. Por exemplo:
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);
Esta consulta executa
ref digitaliza e coloca os bloqueios em registros individuais:-- 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
Esta consulta, ao fazer o mesmo, executa um
range digitaliza e coloca um bloqueio de intervalo após o valor da chave 2 , que não permitirá inserir o valor da chave 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