Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Procedimento armazenado do MySQL causando problemas?


Há pouco que você pode fazer com esta consulta.

Tente isto:

  1. Crie uma PRIMARY KEY em categoryIds (categoryId)

    • Certifique-se de que supplier (supplied_id) é uma PRIMARY KEY

    • Certifique-se de que category_product (ProductID, CategoryID) (nesta ordem) é uma PRIMARY KEY , ou você tem um índice com ProductID 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