Há pouco que você pode fazer com esta consulta.
Tente isto:
-
Crie umaPRIMARY KEY
emcategoryIds (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 comProductID
conduzindo.
-
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