आप इस प्रश्न के साथ बहुत कम कर सकते हैं।
इसे आजमाएं:
-
एक
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
using का उपयोग करके देखें इसके बजाय:
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