Neden 'LOAD DATA INFILE' normal INSERT deyimlerinden daha hızlı?


22

Csv dosyalarından okuyan ve veriyi bir veritabanına ekleyen ifadeyi kullanarak saniyede 60.000LOAD DATA IN FILE eklemeye ulaşabileceğimizi belirten bir makale okudum .

Neden normal uçlardan farklı olmalı?

EDIT:
Ben sadece bir INSERTaçıklama çağırarak gidiş-dönüşü azaltdım:

INSERT INTO tblname
VALUES (NULL,2,'some text here0'),(NULL,2,'some text here1')
    ,(NULL,2,'some text here2'),(NULL,2,'some text here3')
    .....,(NULL,2,'some text here3000');

Peki buna ne dersin?


Medium ile kıyaslanan genişletilmiş uçlara karşı bir makale yazdım LOAD DATA INFILE: MySQL ile yüksek hızlı uçlar . Alt satırda, LOAD DATA INFILEgenişletilmiş kesici uçları kullanma performansının% 65'ini elde edebilirsiniz . Modern donanım için 240.000 uç / saniye aldım.
Benjamin

Yanıtlar:


26

VERİ YÜKLEME INFILE ve genişletilmiş INSERT'lerin her birinin kendine özgü avantajları vardır.

LOAD DATA INFILE, tek tek işlemle masa verilerinin toplu yüklenmesi için, çanlar ve ıslıkların aşağıdaki gibi işlemleri yapması için tasarlanmıştır:

  • İlk Satırları Atlama
  • Belirli Sütunları Atlama
  • Belirli Sütunları Dönüştürme
  • Belirli Sütunları Yüklemek
  • Yinelenen Anahtar Sorunlarını Yönetme

Ayrıştırma için daha az ek yük gerekli

Kapak tarafında, 1.000.000 satır yerine yalnızca 100 satır içe aktarıyorsanız, genişletilmiş INSERT duyarlıdır.

Mysqldump'ın, INSERT başına yüzlerce veya binlerce sıra enjeksiyonunu gerçekleştirdiği gibi verilerle birlikte tablo tasarımı taşımak için genişletilmiş INSERT'ler etrafında tasarlandığına dikkat edin. LOAD DATA INFILE, her zaman şema ve veri arasında fiziksel bir dikoterapi yaratır.

Uygulama açısından bakıldığında LOAD DATA INFILE, şema değişikliğine genişletilmiş INSERT'lerden daha duyarsızdır.

LOAD DATA INFILE'i kullanmanın iyisi, kötüsü ve çirkinliği ileri geri gidebilir. Hangi tekniği kullanırsanız kullanın, daima bulk_insert_buffer_size ayarını yapmalısınız . Niye ya?

Bulk_insert_buffer_size hakkındaki MySQL Belgesine göre:

MyISAM, INSERT ... SELECT, INSERT ... DEĞERLER (...), (...), ... ve LOAD DATA INFILE için toplu eklemeleri daha hızlı yapmak için ağaç benzeri özel bir önbellek kullanır tablolar. Bu değişken, önbellek ağacının boyutunu, iş parçacığı başına bayt olarak sınırlar. 0'a ayarlamak bu optimizasyonu devre dışı bırakır. Varsayılan değer 8 MB'dir.

Yıllar boyunca, müşterinin bunu ayarlamadığından ve 8 MB'a bıraktıktan sonra müşterisini gördüm. Daha sonra, LOAD DATA INFILE kullanmaya karar verir veya mysqldumps içeri aktarırlarsa, yanlış bir şey hissedebilirler. Genellikle bunu makul bir 256M'ye ayarlamanızı tavsiye ederim. Bazı durumlarda, 512M.

Yeterince büyük bir toplu INSERT tamponuna sahip olduğunuzda, her iki tekniği de kullanmak akademik hale gelir ve kişisel tercihinize göre azalır. İsteğe bağlı olarak yalnızca 100 satırlık INSERT topladığınız uygulamalar için uzatılmış INSERT'ler kullanın.

Dürüst olmak gerekirse, LOAD DATA INFILE deyimi, normal INSERT ifadelerinin bir tür yüklü ifade olduğundan daha hızlı olduğunu söyler; çünkü yapılandırma dikkate alınmaz. LOAD DATA INFILE ile uzatılmış INSERT'ler arasında uygun bir bulk_insert_buffer_size ile bir karşılaştırma yapsanız bile, her satır ayrıştırmada kaydedilen nanosaniyeler, yalnızca en iyi LOAD DATA INFILE lehine nominal sonuçlar verebilir.

Devam et ve bunu my.cnf dosyasına ekle

[mysqld]
bulk_inset_buffer_size=256M

Ayrıca genişletilmiş INSERT'leri başlatmadan önce sadece oturumunuz için ayarlayabilirsiniz.

SET bulk_insert_buffer_size= 1024 * 1024 * 256;

GÜNCELLEME 2012-07-19 14:58 EDT

İşleri perspektifte tutmak için toplu ekleme arabelleği InnoDB yerine yalnızca MyISAM tablolarını yüklemek için kullanışlıdır. Toplu yükleme hakkında daha yeni bir yazı yazdım InnoDB: Sabit diskte bekleyen sıkışmış dosyadan Mysql yükü


4

Çoğu veritabanı yönetim sistemi, büyük hacimli verileri hızlı bir şekilde yüklemek için toplu yükleme olanağına sahiptir. Bir INSERTbeyanda önemli miktarda beyan başına bagaj - kilitleme, işlem sınırlaması, referans bütünlüğü kontrolü, kaynakların tahsisi, beyan başına yapılması gereken G / Ç vardır.

Toplu ekleme işlemleri, işlemi kolaylaştırır, böylece bu satır başına daha az ek yüke sahip olur. Bir DBMS, büyüklükteki veri siparişlerini insert ifadelerinden daha hızlı toplu yükleyebilir.


3

Tek tek INSERTifadeleri ayrıştırmak ve yürütmek , bir CSV dosyasını sütunlara bölmek ve doğrudan yüklemek için çok daha büyük bir ek yükü taşır.

Her INSERTifadenin MySQL motoru tarafından ayrı ayrı ayrıştırılması ve geçerliliğinin kontrol edilmesi gerekir - bu ek CPU kaynaklarını tüketir ve ayrıca daha fazla istemci <> sunucusu gidiş dönüşü gerektirir. Toplu yükleme sırasında bunun olması gerekmez LOAD DATA INFILE. LOAD DATA INFILEBoş bir masaya yüklenirken kullanılabilecek optimizasyonlar da vardır . Daha fazla bilgi için bu bağlantıya bakın .


sorumun EDIT bölümünü görün.
ALH

Hazırlanan ifadeleri kullanırken ek ayrıştırma olmadığını unutmayın.
Benjamin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.