MySQL में एक ही INSERT स्टेटमेंट में कई पंक्तियाँ डालने (बैच इंसर्ट) के लिए VALUES सूची को कॉमा से अलग करके लिखें। यह अलग-अलग INSERT से **काफी तेज़** होता है।
सिंटैक्स
INSERT INTO yourTableName (column1, column2, ...)
VALUES
(val1_1, val1_2, ...),
(val2_1, val2_2, ...),
(val3_1, val3_2, ...),
...;
उदाहरण के साथ समझें
टेबल बनाएं:
CREATE TABLE addMultipleValues (
Counter INT NOT NULL
);
बैच इंसर्ट (10 पंक्तियाँ एक साथ)
INSERT INTO addMultipleValues (Counter)
VALUES (1), (2), (3), (4), (5), (6), (7), (8), (9), (10);
परिणाम: Query OK, 10 rows affected (0.27 sec) Records: 10 Duplicates: 0 Warnings: 0
सत्यापित करें
SELECT * FROM addMultipleValues;
आउटपुट:
+---------+
| Counter |
+---------+
| 1 |
| 2 |
| 3 |
| 4 |
| 5 |
| 6 |
| 7 |
| 8 |
| 9 |
| 10 |
+---------+
क्यों बैच इंसर्ट तेज़ है?
| तरीका | नेटवर्क राउंड ट्रिप | पार्स/ऑप्टिमाइज़ | ट्रांजैक्शन ओवरहेड |
|---|---|---|---|
| 10 अलग INSERT | 10 | 10 बार | 10 बार (ऑटोकमिट) |
| 1 बैच INSERT | 1 | 1 बार | 1 बार |
बड़े बैच के लिए बेस्ट प्रैक्टिस
1. बैच आकार सीमित करें
-- 1000-5000 पंक्तियाँ प्रति बैच (पैकेट आकार सीमा: max_allowed_packet)
INSERT INTO table (col) VALUES (...), (...), ...; -- ~1MB प्रति बैच
2. ट्रांजैक्शन में लपेटें
START TRANSACTION;
INSERT INTO table (col) VALUES (...), (...), ...; -- बैच 1
INSERT INTO table (col) VALUES (...), (...), ...; -- बैच 2
COMMIT;
3. ऑटोकमिट बंद करें (यदि मैनुअल)
SET autocommit = 0;
INSERT ...; -- कई बैच
COMMIT;
4. LOAD DATA INFILE (सबसे तेज़ - CSV/TSV के लिए)
LOAD DATA INFILE 'data.csv'
INTO TABLE yourTable
FIELDS TERMINATED BY ','
LINES TERMINATED BY '\n'
IGNORE 1 LINES;
ON DUPLICATE KEY UPDATE के साथ
INSERT INTO users (id, name, email)
VALUES (1, 'John', 'john@example.com'),
(2, 'Jane', 'jane@example.com')
ON DUPLICATE KEY UPDATE
name = VALUES(name),
email = VALUES(email);
INSERT IGNORE के साथ
INSERT IGNORE INTO users (id, email)
VALUES (1, 'a@b.com'), (2, 'c@d.com');
-- डुप्लिकेट की पर त्रुटि नहीं, चुपचाप छोड़ देता है
REPLACE INTO (डिलीट + इंसर्ट)
REPLACE INTO users (id, name) VALUES (1, 'New Name');
-- प्राइमरी/यूनिक की मौजूद होने पर हटाकर नया डालता है
नोट
- एक स्टेटमेंट में अधिकतम पंक्तियाँ:
max_allowed_packetद्वारा सीमित (डिफॉल्ट 64MB) - बहुत बड़ा बैच मेमोरी/लॉक समस्या पैदा कर सकता है
- विदेशी कुंजी जांच:
SET FOREIGN_KEY_CHECKS = 0से तेज़ (सावधानी से) - यूनिक कंस्ट्रेंट उल्लंघन पर पूरा बैच विफल होता है (IGNORE/ON DUPLICATE KEY के बिना)