मैं एक ऐसे एप्लिकेशन को लिख रहा हूं, जिसमें बड़ी संख्या में अपडेट के लिए डेटाबेस को विस्तारित अवधि के लिए फ्लश करने की आवश्यकता है, और मैं क्वेरी को ऑप्टिमाइज़ करने के तरीके पर अटक गया हूं। वर्तमान में मैं उपयोग कर रहा हूं INSERT INTO ... VALUES (..), (..) ON DUPLICATE KEY UPDATE
, जो सभी मानों को एक क्वेरी में बैचने का काम करता है, लेकिन बड़े तालिकाओं पर धीरे-धीरे निष्पादित होता है। मुझे वास्तव में पंक्तियों को सम्मिलित करने की आवश्यकता नहीं है।
अन्य दृष्टिकोण जो मैंने देखे हैं वे अद्यतन करने के लिए हैं SET value = CASE WHEN...
(जो कि प्रश्नों के निर्माण के तरीके के कारण उत्पन्न करना कठिन होगा, और मैं CASE
सैकड़ों / हजारों कुंजियों के प्रदर्शन के बारे में निश्चित नहीं हूं ), और बस कई संक्षिप्त अद्यतन। क्या इनमें से कोई भी मेरी वर्तमान विधि से तेज़ होगा?
यह मुझे चकित करता है, जहां तक मैं बता सकता हूं, MySQL में ऐसा करने के लिए कोई मुहावरेदार, कुशल तरीका नहीं है। अगर वास्तव में ऐसा कोई रास्ता नहीं है जो इससे तेज है ON DUPLICATE KEY
, तो क्या पोस्टग्रेसीक्यूएल पर स्विच करने और इसके UPDATE FROM
सिंटैक्स का उपयोग करने के लिए इसके लायक होगा ?
किसी भी अन्य सुझाव भी बहुत सराहना की है!
संपादित करें: यहाँ एक टेबल है जो बार-बार अपडेट की जाती है। मैंने उन्हें अप्रासंगिक होने के कारण कॉलम नाम हटा दिए हैं।
CREATE TABLE IF NOT EXISTS `table` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`a` bigint(20) unsigned NOT NULL DEFAULT '0',
`b` bigint(20) unsigned NOT NULL DEFAULT '0',
`c` enum('0','1','2') NOT NULL DEFAULT '0',
`d` char(32) NOT NULL,
-- trimmed --
PRIMARY KEY (`id`),
KEY `a` (`a`),
KEY `b` (`b`),
KEY `c` (`c`),
KEY `d` (`d`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;