PHP İle Hizli Veritabani Islemleri
-
Merhaba a dostlar,
Saniyelik gelen 200 ile 4000 arasi veriyi mysql db de kontrol edip yoksa eklettiriyorum. Ama mukemmel yavas isliyor.
Dusundum ki ekliyim, coklu kayitlari sileyim. O da yaramadi.
Hepsini nasil hizli bir sekilde ekleyebilirim, ve huncelleyebilirim ? ( PDO kullaniyorum, varsa daha hizli bir yontem db bile degisirim. )
Tesekkurler.
-
Php ve mysql konusunda bir bilgim yok ama mssql'de olsa benzersiz olmasını istediğim sütunları unic (bu yazılıştan emin değilim) sütun yapardım.
Kayıt işlemlerini de try catch ile yapardım.
Aynı kayıttan daha önce varsa catch bloğu çalışacağı için kaydetmeyecek, yoksa try komutu çalışacağı için kaydedecektir.
-
Mysql'de unique kullansam ise yarar mi acaba ? Yani soyle DB Kontrolu kastiriyor bende. Yani insert islemini devre disi birakinca da cok fark olmuyor performansta. Bu kontrolden kurtulmaliyim. Ama islemler de cok hizli olmali.
-
-
Hocam gelen verileri çektiğin yerden farklı şekilde çekmen mümkünse en mantıklısı o , onun dışında saniyelik gelen 200 ile 4k arası veriyi sorgutman hangi db olsa kasar.
Ya da seninde ddiğin gibi tüm kayıtları ekler sonra aşağıdaki sql koduyla kısa sürede benzersiz kayıtları silebilirsin
CREATE TABLE Benzersizkayitlar as SELECT * FROM Tablo GROUP BY Sutun
-
Framework kullanmak biraz daha rahat ettirebilir. Veritabani icin Redbeanphp kullanabilirsin hocam
-
Hız dediğin göreceli bir kavramdır belki de sunucunun donanımına göre optimum hızla çalışıyor olabilir daha fazla detay, daha fazla yardım seçeneği doğurur. Bütçen yeterliyse sunucunda SSD disk hatta bütçene göre raid konfigurasyonlar oluşturarak disk i/o'yu hızlandırabilirsin ek olarak önce kontrol ediyorsan her halukarda index kullanman gerekiyor. https://dev.mysql.com/doc/refman/5.5/en/optimization-indexes.html buradan index kullanımıyla ilgili detaylı bilgi bulabilirsin. İlgili işlemi gerçekleştirirken requestleri mvc'den geçirmen ek olarak sunucuya apache yükü eklenmesi demek mümkün olan minimum kodla işi halletmen senin yararına olacaktır. Minimum kod derken az kod yazmanı değil, az yoran kod demek istiyorum. https://github.com/nafigator/php-bench/tree/master/Tests burada bazı fonksiyonların testleri var (hızlı olması için include mu, require mi kullanmalı vs..) test ederken gelen requestleri farklı metodlarla almayı denemek de hızı arttırabilir. Örneğin veriyi json veya xml alman belki yararına olabilir test etmeni öneririm.
Son olarak bu önerilerin hepsini anlık olarak request alman gerektiğini düşünerek yaptım elinde sabit bir veri var ve bunu işlemeye çalışıyorsan en mantıklı olan bunu gerekiyorsa excel yardımıyla sql verisi haline getirip bigDum PhpMyAdmin, veya direk komut satırından import etmen (http://dev.mysql.com/doc/refman/5.7/en/mysql.html) daha hızlı sonuç verecektir.
-
Kuyruk protokolleri bunun için var windows sa msmq linux sa ki en iyisi rabbitmq kullan bir servis yaz kuyrugu okuyup db ye ekleyen bitti gitti veri kaybın olmaz 😉
-
unique index eklersen aynı olan sadece 1 tane kayıt olabilir database nde
-
Problemin php probleminden çok veritabanı problemi senin. Kolay ve basit çözümleri anlatayım.
1) Prepared Statement kullanırsan (PDO'dan kolaylıkla yapabilirsin) parsing derdinden kullanır hız kazanırsın.
2) Autocommit i kapat. Her statementtan sonra PHP otomatik olarak single transaction başlatır ve statment sonrasında commit gönderir. Autocommit i önce kapatıp sonra transaction başlatıp insert işlemlerin bittikten sonra commit yaparsan bariz bir hız kazanacaksın.
3) Mümkünse stored procedure yaz. Stored procedure doğrudan mysql server üzerinde çalışacağı için iş phpden çok mysql'e yıkılacaktır (ki olması gereken budur)
4) Unique index kullanmak karşılaştırdığın değerler sayı ise mantıklı olabilir ancak text compare yapıyorsa çokta bir faydasını göreceğini zannetmiyorum.
5) Yapacağın işi RAM'de yapıp (memcache gibi bir uygulama sayesinde) en son veritabanına atabilirsin (veri büyüklüğünü bilmediğim için bir alternatif olabilir. Çok büyük verilerde işe yaramaz)
6) @DesertSun' ın dediği gibi kuyruk protokolleri kullanıp işini doğrudan onlara yıkabilirsin. PHP' de bu tarz libraryler varmı bilmiyorum. Araştırmak lazım.
Hadi hayırlı traşlar
-
@S2buyuk : Hocam butun onerilerin icin tesekkur ederim. Ozellikle arastiracagim. ( Bir cogunu bilmedigim icin. )