टीएल; डॉ: LOAD DATA INFILE परिमाण का एक क्रम एकाधिक INSERT . से तेज है बयान, जो स्वयं एक INSERT . से तेज परिमाण का एक क्रम है बयान।
मैं आर से माइस्क्ल में डेटा आयात करने के लिए तीन मुख्य रणनीतियों के नीचे बेंचमार्क करता हूं:
-
एकल
insertबयान , जैसा कि प्रश्न में है:INSERT INTO test (col1,col2,col3) VALUES (1,2,3) -
एकाधिक
insertबयान , इस प्रकार बनाया गया:INSERT INTO test (col1,col2,col3) VALUES (1,2,3),(4,5,6),(7,8,9) -
load data infileकथन , यानीmysql. में पहले से लिखी गई CSV फ़ाइल लोड करना :LOAD DATA INFILE 'the_dump.csv' INTO TABLE test
मैं RMySQL का उपयोग करता हूं यहां, लेकिन किसी भी अन्य MySQL ड्राइवर को समान परिणाम प्राप्त करने चाहिए। SQL तालिका के साथ त्वरित किया गया था:
CREATE TABLE `test` (
`col1` double, `col2` double, `col3` double, `col4` double, `col5` double
) ENGINE=MyISAM;
कनेक्शन और परीक्षण डेटा R . में बनाए गए थे साथ:
library(RMySQL)
con = dbConnect(MySQL(),
user = 'the_user',
password = 'the_password',
host = '127.0.0.1',
dbname='test')
n_rows = 1000000 # number of tuples
n_cols = 5 # number of fields
dump = matrix(runif(n_rows*n_cols), ncol=n_cols, nrow=n_rows)
colnames(dump) = paste0('col',1:n_cols)
बेंचमार्किंग सिंगल insert कथन:
before = Sys.time()
for (i in 1:nrow(dump)) {
query = paste0('INSERT INTO test (',paste0(colnames(dump),collapse = ','),') VALUES (',paste0(dump[i,],collapse = ','),');')
dbExecute(con, query)
}
time_naive = Sys.time() - before
=> इसमें लगभग 4 मिनट का समय लगता है मेरे कंप्यूटर पर
एकाधिक बेंचमार्किंग insert कथन:
before = Sys.time()
chunksize = 10000 # arbitrary chunk size
for (i in 1:ceiling(nrow(dump)/chunksize)) {
query = paste0('INSERT INTO test (',paste0(colnames(dump),collapse = ','),') VALUES ')
vals = NULL
for (j in 1:chunksize) {
k = (i-1)*chunksize+j
if (k <= nrow(dump)) {
vals[j] = paste0('(', paste0(dump[k,],collapse = ','), ')')
}
}
query = paste0(query, paste0(vals,collapse=','))
dbExecute(con, query)
}
time_chunked = Sys.time() - before
=> इसमें लगभग 40 सेकंड का समय लगता है मेरे कंप्यूटर पर
बेंचमार्किंग load data infile कथन :
before = Sys.time()
write.table(dump, 'the_dump.csv',
row.names = F, col.names=F, sep='\t')
query = "LOAD DATA INFILE 'the_dump.csv' INTO TABLE test"
dbSendStatement(con, query)
time_infile = Sys.time() - before
=> इसमें लगभग 4 सेकंड लगते हैं मेरे कंप्यूटर पर
कई सम्मिलित मानों को संभालने के लिए अपनी SQL क्वेरी को क्राफ्ट करना प्रदर्शन को बेहतर बनाने का सबसे सरल तरीका है। LOAD DATA INFILE . में संक्रमण इष्टतम परिणामों की ओर ले जाएगा। अच्छे प्रदर्शन युक्तियाँ mysql प्रलेखन के इस पृष्ठ में पाई जा सकती हैं। /ए> ।