Bạn có thể làm ít việc với truy vấn này.
Hãy thử điều này:
-
Tạo
PRIMARY KEY
trêncategoryIds (categoryId)
-
Đảm bảo rằng
supplier (supplied_id)
làPRIMARY KEY
-
Đảm bảo rằng
category_product (ProductID, CategoryID)
(theo thứ tự này) làPRIMARY KEY
hoặc bạn có chỉ mục vớiProductID
dẫn đầu.
-
Cập nhật:
Nếu đó là INSERT
nguyên nhân gây ra sự cố và product_search_query
trong MyISAM
bảng vấn đề có thể gặp phải với MyISAM
khóa.
MyISAM
khóa toàn bộ bảng nếu nó quyết định chèn một hàng vào một khối trống ở giữa bảng, điều này có thể gây ra hết thời gian.
Hãy thử sử dụng INSERT DELAYED
thay vào đó:
IF @resultsFound > 0 THEN
INSERT DELAYED INTO product_search_query (QueryText, CategoryId) VALUES (keywords, topLevelCategoryId);
END IF;
Thao tác này sẽ đưa các bản ghi vào hàng đợi chèn và trả về ngay lập tức. Bản ghi sẽ được thêm vào sau một cách không đồng bộ.
Lưu ý rằng bạn có thể mất thông tin nếu máy chủ chết sau khi lệnh được đưa ra nhưng trước khi bản ghi thực sự được chèn.
Cập nhật:
Vì bảng của bạn là InnoDB
, nó có thể là một vấn đề với khóa bảng. INSERT DELAYED
không được hỗ trợ trên InnoDB
.
Tùy thuộc vào bản chất của truy vấn, DML
truy vấn trên InnoDB
bảng có thể đặt các khóa khe hở để khóa các miếng chèn.
Ví dụ:
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);
Truy vấn này thực hiện ref
quét và đặt ổ khóa trên các bản ghi cá nhân:
-- 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
Truy vấn này, trong khi thực hiện tương tự, thực hiện một range
quét và đặt một khóa khoảng trống sau giá trị khóa 2
, điều này sẽ không cho phép chèn giá trị khóa 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