このクエリでできることはほとんどありません。
これを試してください:
-
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