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