बड़े बैचों के लिए स्पीड डालें


10

मेरे आवेदन में, मेरे INSERT समय का एक बड़ा हिस्सा ले रहे हैं। मेरे पास मेमोरी (~ 40-50,000) में बड़ी संख्या में ऑब्जेक्ट हैं जो मैं एक तालिका में सम्मिलित करना चाहता हूं।

सैंपल टेबल लेते हैं

CREATE TABLE bill (
id BIGINT(20) PRIMARY KEY,
amount INT(11) DEFAULT 0,
bill_date DATETIME DEFAULT NOW(),
INDEX (bill_date)
) ENGINE=InnoDB

मेरे बैच के आकार के रूप में 3 पंक्तियाँ लेना, निम्नलिखित दृष्टिकोण हैं जो मैं डालने के लिए सोच सकता था

दृष्टिकोण 1 - निर्माण और आग 3 कच्चे आवेषण

INSERT INTO bill (amount, bill_date) VALUES (10, '2012-01-01 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (20, '2012-01-02 00:00:00');
INSERT INTO bill (amount, bill_date) VALUES (40, '2013-02-05 00:00:00');

दृष्टिकोण 2 - 1 क्वेरी में मानों को क्लब करना

INSERT INTO bill (amount, bill_date) VALUES 
(10, '2012-01-01 00:00:00'),
(20, '2012-01-02 00:00:00'),
(40, '2013-02-05 00:00:00');

दृष्टिकोण 3 - 6 मापदंडों से गुजरते हुए इस क्वेरी को 1 बार फायर करें

INSERT INTO bill (amount, bill_date) VALUES 
(?, ?), (?, ?), (?, ?);

दृष्टिकोण 4 - हर बार 2 मापदंडों को बदलते हुए इस तैयार क्वेरी को 3 बार फायर करें

INSERT INTO bill (amount, bill_date) VALUES (?, ?);

किसी भी अन्य दृष्टिकोण का स्वागत है।

मेरा सवाल यह है कि

एक तालिका में कई आवेषण बनाने का सबसे तेज़ तरीका क्या है?

मैंने इस लिंक को mysql इन्सर्ट स्पीड और इस गाइड को JDBC प्रोग्रामिंग पर पढ़ा है , लेकिन मैं किसी निष्कर्ष पर नहीं पहुँच पाया।

मेरा मामला -

वर्तमान में मेरी तालिका में ~ 20 कॉलम हैं, जिनमें से अधिकांश संख्याएँ हैं, जिनमें दो जोड़े (60) और 1 टेक्स्ट कॉलम हैं। मैसूरल संस्करण 5.5। INNODB पर चल रहा है और इंटेगर प्राथमिक कुंजी पर 1 सूचकांक है। सभी प्रश्न लेनदेन में चलते हैं।

मैं जावा से अपने प्रश्नों का निर्माण करता हूं और प्रश्नों को चलाने के लिए स्प्रिंग JDBC का उपयोग करता हूं।

मैं वर्तमान में दृष्टिकोण 3 का अनुसरण कर रहा हूं, 20,000 आवेषण के लिए खाली तालिका में लगभग 10 सेकंड लग रहे हैं, न कि क्वेरी के निर्माण में लगने वाले समय को शामिल करने के लिए।

चीजों को परिप्रेक्ष्य में रखने के लिए, तालिका से डेटा प्राप्त करने के लिए इसकी 100-200 मिली ले।

क्या मैं कुछ छोड़ रहा हूं? मैं आवेषण कैसे तेज़ करूँ?


स्टैक ओवरफ्लो पर संबंधित प्रश्न: MySQL और JDBC को फिर से लिखना के साथ BatchedStatements = true
Gord Thompson

जवाबों:


3

अपने कमिट को बैचने पर विचार करें। 1024 का एक बैच आकार एक अच्छा प्रारंभिक आकार है। बैच आकार बदलें जब तक आप अपने इष्टतम थ्रूपुट तक नहीं पहुंचते।


1

क्या आपने परीक्षण किया है या क्या यह संभव है कि आप डीबी टेबल (ओं) को गंतव्य पर अनुक्रमित करें, जहां आप सम्मिलित कर रहे हैं, उन छोटे बैचों वाले टुकड़ों में डालें (जैसा कि ऊपर बताया गया है), और फिर गंतव्य तालिका (ओं) पर अनुक्रमितों का पुनर्निर्माण करें। एक बार सभी आवेषण पूर्ण हो जाने के बाद? पुष्टि करने के लिए परीक्षण करने के लिए पर्याप्त कुछ आसान हो सकता है।


0

Mysql डॉक्यूमेंट से कुछ बल्क डेटा लोडिंग टिप्स उपयोगी है। https://dev.mysql.com/doc/refman/5.6/en/optimizing-innodb-bulk-data-loading.html

आप कुछ तरीकों से इन्सर्ट स्पीड बढ़ा सकते हैं:

- turn off autocommit
- turn off unique check
- turn off foreign check

उममीद है कि इससे मदद मिलेगी !


2
यदि बाधा जाँच (अद्वितीय, विदेशी कुंजी, ...) को बंद करना बहुत सुनिश्चित हो, तो आपका डेटा उन्हें नहीं तोड़ता है या आपका डेटाबेस उस बिंदु से असंगत स्थिति में है।
डेविड स्पिललेट
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.