आप एक ट्रिक के साथ बल्क अपडेट ऑपरेशंस को तेज कर सकते हैं, भले ही डेटाबेस-सर्वर (जैसे आपके मामले में) में बहुत खराब लेटेंसी हो। अपनी तालिका को सीधे अपडेट करने के बजाय, आप एक मंच-तालिका . का उपयोग करते हैं अपना नया डेटा बहुत तेज़ी से सम्मिलित करने के लिए, फिर गंतव्य-तालिका में एक बार शामिल होने का अद्यतन करें . इसका यह भी फायदा है कि आप डेटाबेस को भेजने के लिए बयानों की संख्या को काफी नाटकीय ढंग से कम कर देते हैं।
यह UPDATEs के साथ कैसे काम करता है?
मान लें कि आपके पास एक टेबल है entries
और आपके पास हर समय नया डेटा आ रहा है, लेकिन आप केवल उन्हीं को अपडेट करना चाहते हैं जो पहले से संग्रहीत हैं। आप अपनी गंतव्य-तालिका entries_stage
. की एक प्रति बनाते हैं इसमें केवल प्रासंगिक क्षेत्रों के साथ:
entries = Table('entries', metadata,
Column('id', Integer, autoincrement=True, primary_key=True),
Column('value', Unicode(64), nullable=False),
)
entries_stage = Table('entries_stage', metadata,
Column('id', Integer, autoincrement=False, unique=True),
Column('value', Unicode(64), nullable=False),
)
फिर आप अपना डेटा बल्क-इन्सर्ट के साथ डालें। यदि आप MySQL के मल्टीपल वैल्यू इंसर्ट सिंटैक्स का उपयोग करते हैं, तो इसे और भी तेज किया जा सकता है, जो मूल रूप से SQLAlchemy द्वारा समर्थित नहीं है, लेकिन इसे बिना किसी कठिनाई के बनाया जा सकता है।
INSERT INTO enries_stage (`id`, `value`)
VALUES
(1, 'string1'), (2, 'string2'), (3, 'string3'), ...;
अंत में, आप गंतव्य-तालिका के मानों को चरण-तालिका के मानों के साथ इस प्रकार अपडेट करते हैं:
UPDATE entries e
JOIN entries_stage es ON e.id = es.id
SET e.value = es.value;
फिर आपका काम हो गया।
आवेषण के बारे में क्या?
यह निश्चित रूप से आवेषण को गति देने के लिए भी काम करता है। जैसा कि आपके पास पहले से ही स्टेज-टेबल . में डेटा है , आपको बस एक INSERT INTO ... SELECT
. जारी करना है विवरण, डेटा के साथ जो गंतव्य-तालिका . में नहीं है अभी तक।
INSERT INTO entries (id, value)
SELECT FROM entries_stage es
LEFT JOIN entries e ON e.id = es.id
HAVING e.id IS NULL;
इसके बारे में अच्छी बात यह है कि आपको INSERT IGNORE
करने की जरूरत नहीं है , REPLACE
या ON DUPLICATE KEY UPDATE
, जो आपकी प्राथमिक कुंजी को बढ़ाएगी, भले ही वे कुछ न करें ।