समाधान: ट्रांजैक्शन के साथ बल्क इंसर्ट
एकाधिक रिकॉर्ड डालते समय, प्रत्येक INSERT के लिए अलग ट्रांजैक्शन के बजाय एक ही ट्रांजैक्शन में बल्क INSERT का उपयोग करके प्रदर्शन में नाटकीय सुधार होता है।
सिंटैक्स
START TRANSACTION;
INSERT INTO yourTableName (col1, col2, ...N)
VALUES
(val1, val2, ...N),
(val1, val2, ...N),
...N;
COMMIT;
व्यावहारिक उदाहरण
टेबल बनाना
mysql> CREATE TABLE insertDemo (
-> StudentId INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> StudentName VARCHAR(20),
-> StudentAge INT
-> );
ट्रांजैक्शन के साथ बल्क इंसर्ट
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO insertDemo(StudentName, StudentAge) VALUES
-> ('John', 21), ('Carol', 22), ('Bob', 21), ('David', 24),
-> ('Maxwell', 25), ('Mike', 22);
Query OK, 6 rows affected (0.00 sec)
Records: 6 Duplicates: 0 Warnings: 0
mysql> COMMIT;
Query OK, 0 rows affected (0.14 sec)
परिणाम
| StudentId | StudentName | StudentAge |
| 1 | John | 21 |
| 2 | Carol | 22 |
| 3 | Bob | 21 |
| 4 | David | 24 |
| 5 | Maxwell | 25 |
| 6 | Mike | 22 |
प्रदर्शन तुलना
| विधि | 1000 पंक्तियों के लिए अनुमानित समय | कारण |
| अलग-अलग INSERT (ऑटोकमिट) | ~2-5 सेकंड | प्रति पंक्ति ट्रांजैक्शन ओवरहेड |
| बल्क INSERT (एक VALUES सूची) | ~0.1-0.5 सेकंड | एकल पार्स/ऑप्टिमाइज़, एकल ट्रांजैक्शन |
| LOAD DATA INFILE | ~0.01-0.1 सेकंड | सबसे तेज़, न्यूनतम SQL पार्सिंग |
अनुकूलन युक्तियाँ
- बैच आकार: 1000-5000 पंक्तियों प्रति बैच (बहुत बड़े से बचें)
- इंडेक्स: बल्क लोड के दौरान गैर-अद्वितीय इंडेक्स अक्षम करें, बाद में पुनर्निर्माण करें
- LOAD DATA INFILE: CSV/TSV फ़ाइलों के लिए सबसे तेज़
- innodb_flush_log_at_trx_commit=2 अस्थायी रूप से सेट करें (सावधानी से)