मैं दो तालिकाओं के साथ एक MySQL डेटाबेस में उपयोगकर्ताओं का एक बहुत डालने के लिए कोशिश कर रहा हूँ:MySQL बैच डालने
पहली तालिका उपयोगकर्ता डेटा होता है। एक उदाहरण INSERT
इस तरह दिखता है (id
प्राथमिक कुंजी है, mail
एक अद्वितीय कुंजी है):
INSERT INTO users (id, mail, name)
VALUES (NULL, "[email protected]", "John Smith")
ON DUPLICATE KEY UPDATE name = VALUE(name)
दूसरी तालिका समूह उपयोगकर्ता के अंतर्गत आता है शामिल हैं। यह केवल दो विदेशी कुंजी users_id
और groups_id
स्टोर करता है। एक उदाहरण क्वेरी इस तरह दिखती है:
INSERT INTO users_groups (users_id, groups_id)
VALUES (LAST_INSERT_ID(), 1)
यह सेटअप छोटे डेटा सेट के लिए पूरी तरह से ठीक काम करता है। जब मैं बड़ी मात्रा में डेटा आयात करता हूं (> 1 एम पंक्तियां) INSERT
एस धीमा हो जाता है। जाहिर है, यह बहुत अच्छा होगा एक बैच डालने करना है:
INSERT INTO users (id, mail, name)
VALUES (NULL, "[email protected]", "John Smith"), (NULL, "[email protected].tld", "Anna Smith")
ON DUPLICATE KEY UPDATE name = VALUE(name)
और:
INSERT INTO users_groups (users_id, groups_id)
VALUES (LAST_INSERT_ID(), 1), (LAST_INSERT_ID(), 4)
निश्चित रूप से समस्या है, कि LAST_INSERT_ID()
केवल एक (प्रथम) एक बैच INSERT
की आईडी देता है।
तो, मुझे जो चाहिए वह "नेस्टेड" बैच INSERT
है, जो आईएमओ MySQL में मौजूद नहीं है।
मैं अपने INSERT
को तेज़ी से बनाने के लिए क्या कर सकता हूं?
यदि आपके पास मेल कॉलम पर एक अनुक्रमणिका है उदाहरण के लिए, आप समूह तालिका को भरने के लिए बस 'डालने का चयन करें' कथन के साथ जा सकते हैं। चयन कथन में, फिर आप ईमेल के आधार पर समूह को असाइन करते समय एक केस का अभिव्यक्ति का उपयोग करेंगे। लेकिन अगर हार्वे का समाधान पुष्टि हो गया है तो यह बेहतर है। – Sebas
क्या आप कुछ संदर्भ दे सकते हैं? कार्यक्रमों में इतनी बड़ी संख्या में पंक्तियों को डालने का असामान्य उपयोग केस है। यदि यह एक बार का ऑपरेशन है, तो एक लंबा निष्पादन समय एक गैर-मुद्दा हो सकता है। यदि यह एक नियमित सिंक्रनाइज़ेशन है, तो शायद आपको प्रतिकृति में देखना चाहिए, या यहां तक कि अपने अनुप्रयोगों में उपयोगकर्ता तालिका साझा करना चाहिए। – RandomSeed