Ölçekler bir şekilde birden fazla MySQL ınsert'ler yapmak nasıl (PHP)

6 Cevap php

Biz bir tabloya satır ekler bizim PHP kodu bir döngü var. örneğin:

while ($info = mysql_fetch_assoc($someQuery)) {
    mysql_query("INSERT INTO X (i,j) VALUES ($info['ii'],$info['jj'])");
}

Döngü yalnızca birkaç kez yinelemek istiyorum çünkü bu bir kaç ay önce iyiydi. Ancak, web sitemizde daha fazla trafik almak için bu döngü şimdi bazen 1000 veya daha fazla kez dolaşır. Tablo olan bazı overhead (4,305 KiB) ve bu tablodan seçer onlar ınsert'ler uzun bir liste için beklemek zorunda çünkü muhtemelen, MySQL slow-log olarak ortaya çıkıyor kilitleri serbest bırakmak için?

Daha iyi ölçek böylece nasıl optimize kod gerekir?

Ben denemek düşündüm bazı şeyler:

  • INSERT DELAYED - içine bakmak gerekir. O yardımcı olabilir mi?
  • Aynı sorguda birden çok satır takmayı deneyin. Ama ben ne sınırı ayarlamak gerekir? 50, 500, 1000?

6 Cevap

Nedir $someQuery? Eğer INSERT ... SELECT sözdizimi kullanabilir miyim?

Bunun yerine mysql_query(), kullanımı tekrarlayan prepared statements. Farklı değerleri ile aynı sorguda birçok kez yinelenen çok daha etkili bir yoldur.

Ayrıca, ben yavaş günlüğünde görünmesini olan bu sorguları içine bakmak istiyorum. EXPLAIN (<query>) endeksleri kullanılıyor olduğunu kontrol etmek için kullanın.

Siz de böyle bir açıklama kurabilirsiniz:

INSERT INTO X (i,j)
VALUES ($info['ii'],$info['jj']),
(val, val),
...
(val, val);

Her yerde eğer, SQL çok uzun olur, nerede belirlemek için farklı limitler deneyebilirsiniz. Sonra aklı başında bir şey limitini ayarlayabilirsiniz.

Ne Ben dedi James önemlidir. Hazırlanan deyimleri aynı SQL çalıştırmak, çok daha hızlı, ve sadece parametreleri değiştirmek.

Ayrıca, Sen benim deneyin gibi bir şey için tüm döngü değiştirmek için:

INSERT INTO x (i, j) SELECT (here goes your $someQuery)

Tabii ki $ someQuery uyum var, bu yüzden sütunları i ve j olarak (otomatik döküm veya can) aynı tipte sadece iki sütun seçer.

Eğer php çok karmaşık bir mekanizma yoksa, o zaman bu mümkün olabilir shloud ve herhangi bir php döngü çok daha hızlı olacaktır.

MySQL veri almak için en hızlı yollarından biri LOAD DATA INFILE . Think of it as a CSV import. You could write your data one row at a time to disk and then do a bulk load. According to this page on insert speeds LOAD DATA INFILE düz INSERT daha 20x hızlıdır.

Tablo ayrıca bir anda tüm süreç yerine sadece bir satır için kilitlenmiş olabilir gibi olsa da, diğer istenmeyen yan etkiler olabilir. Mesela bu Koşu 100 satır toplu yönetilebilir sorunun iki parça yapabilir - Ben sadece deneme gerekir düşünüyorum.

MySQL yeni sürümlerinde saklanan prosedürler ve fonksiyonu vardır. Sen değişkenler, döngüler ve koşullu bloklar orada yapısal bir dil kullanabilirsiniz. Bir saklı yordam birçok bağımsız uçlar daha hızlı olmalıdır. Ancak, öğrenmek için yeni bir dildir.

Saklı yordamları kullanmak için, php mysqli uzantısı gerekir.

You can also look at mysqli_multi_query.
http://pl.php.net/manual/en/mysqli.multi-query.php