6000 Satırları INSERT - en iyi uygulama

6 Cevap php

Ben kolayca 6k + sonuçları dönebilirsiniz bir API yöntemini çağıran bir PHP komut dosyası var.

Ben DB için bir foreach döngüsü içinde her satırı yazmak için PEAR DB_DataObject kullanın.

Yukarıdaki komut toplu işlem bir defada 20 kullanıcı - ve bazıları sadece API diğerlerinden birkaç sonuç olmasa da daha fazla olacaktır. En kötü durumda, tüm sonuçları 1000 olması.

Apı'sini döngü ok gibi görünüyor, 20 her 5 dakikada toplu çalışıyor. Benim tek endişem (taze API çağrıları her kullanıcı arasında uzun bir duraklama) her kullanıcı için mysql ınsert'ler 1000 olduğunu

Bunu yapmak için iyi bir yolu var mı? Ya da ben bunu iyi bir şekilde yapıyorum?!

6 Cevap

Peki, bunu yapmak için en hızlı yolu bu gibi değerlerin dolu bir ekleme deyimini yapmak olacaktır:

INSERT INTO mytable (col1, col2) VALUES ( (?,?), (?,?), (?,?), ...)

Ama muhtemelen şu anda kullandığınız DB_DataObject yöntemini hendek açılması gerektirir. Sadece o DB_DataObject kullanma "kullanım kolaylığı" yararları vs bu şekilde yapmanın performans yararları tartmak gerekir.

Peki, yöntem işleyebilir daha fazla yük üretiyor? Bu çalışma eğer, o zaman ben hazırlıksız değiştirmek için herhangi bir neden göremiyorum.

Veritabanı soyutlama katmanları genellikle yükü oldukça iyi bir miktar ekleyin. Ben PHP atleast, o seçtiğiniz kütüphane optimize etmek daha hız uğruna bir düz mysql_query kullanımı çok daha kolay, olduğunu tespit ettik.

Eric P gibi ve weinzierl.name bir çok satır ekleme veya yük kullanarak, dedi size iyi doğrudan bir performans verecektir.

Ben birkaç fikir var, ama test ile onları doğrulamak zorunda kalacaktır.

Size eklediğiniz tablo dizinleri varsa, onlar uçlar için optimize edilmiştir emin olmak için deneyin.

Check out optimization options here: http://dev.mysql.com/doc/refman/5.0/en/insert-speed.html

Doğrudan mysqli düşünün, ya da Armut :: MDB2 veya PDO. Ben armut kendimi kullanmayın olsa Armut :: DB, oldukça yavaş olduğunu anlamak, böylece kontrol edemez.

MySQL LOAD DATA INFILE özelliği muhtemelen ne istediğinizi yapmak için en hızlı yoldur.

Sen Speed of INSERT statements MySQL Dokümantasyon bölümünde de bir göz atabilirsiniz.

Bu MySQL takmadan geliştirmek için yol bir sürü bahsediyor.

Ben birkaç bin kayıtları veritabanı üzerinde herhangi bir yük koymak gerektiğini sanmıyorum; hatta benim laptop o güzel işlemesi gerekir. Eğer herhangi bir temizleme ya da bölümleme yapmazsak büyük endişe might (gel) devasa tablolar olabilir. O kısmı üzerinde erken optimizasyon kaçının.

Senin yönteminde olduğu gibi, ayrı bir işlem, her kullanıcı (veya toplu iş) yapmak emin olun. Mysql varsa, gereksiz kilitleme önlemek için InnoDB kullandığınızdan emin olun. Zaten işlemleri destekler innodb / postgres / diğer veritabanı kullanıyorsanız size önemli bir performans artışı görebilirsiniz.

KOPYA (- mysql konusunda emin azından postgres'in üzerine) kullanmayı düşünün.

Masa düzgün (kullanılmamış olanları kaldırma dahil) endeksli olduğundan emin olun. Endeksleri insert hızı zarar.

Düzenli / vakum optimize etmek hatırlıyorum.