PHP PERFORMANS-WISE MySQL için hazırlanmış deyimleri kullanmalı mıyım?

4 Cevap php

Ben MySQL hazırlanan tabloların güvenlik faydaları anlamak. Burada bu konuyu kapsayacak gerek yok. Onlardan performans yönü merak ediyorum.

Sorgu yalnızca her bir sorgu için bir kez, bir kez ayrıştırılır çünkü hazırlanmış bir deyimi kullanarak bir sorgu tek bir PHP komut dosyası iki kez çalıştırıldığında Şimdi, biliyorum, daha hızlı. İstemci hazırlamak için bir gezi yapar, sonra iki kez ikili protokolünü kullanarak veri gönderir. Ikili protokol daha hızlı, ve ikinci bir kez ayrıştırmak zorunda isabet alarak değil.

Ancak, ne ben sadece tek bir PHP komut dosyası bir kez sorgu gerçekleştirmek istediğiniz davayla ilgili? Bu kez hazırlamak için, sunucuya iki geziler yapıyoruz çünkü hazır deyim, kötü kullanıldığı gibi görünüyor, ve bir kez veri göndermek için. Sadece bir kez ayrıştırmak zorunda yararı kaybolur, ve bu ikinci gezi için cezalandırılmış demektir. Veri ikili biçimde yeterince küçük değilse, doğru hazırlanmış bir deyimi kullanarak kaybetmek?

Ancak, PHP'nin mysqli veya PDO kütüphaneleri ne hakkında bazı çelişkili raporlar okudum? Ya onları komut dosyası yürütme karşısında hazırlanmış deyimi önbelleğe musunuz? Sunucu bir sonraki pageload üzerinde veya yeniden hazırlanmış deyimi ayrıştırmak zorunda mı? Cevap deyimi ikinci pageload çözümlenen olmak zorunda değil ki, hayır ise, o zaman sadece pageload kez başına sorgu yürütme olsanız bile hazır tablolar, daha iyi olduğu görünüyor.

Şey bu ilgili MySQL sürümleri arasında değişti eğer dikkate alınız. Sen güvenle PHP 5.2 kullanıyorum varsayabiliriz

EDIT: Sadece açıklığa kavuşturmak için, ben MySQL sürümü belirterek, özellikle MySQL ve PHP için bir cevap istiyorum ve bu hiç farklı oldu, ve SADECE performansını dikkate eğer, kullanım veya güvenlik kolaylığı değil.

GÜNCELLEME: Ben çünkü takip yorumun yaptım cevabı kabul birkaç iyi fikirleri vardı. Ben hala kimse ben herhangi bir kesinlik sordu gerçek sorunun dönüm noktası cevap mümkün görünüyor ki biraz hayal kırıklığına uğrattı. Bazen cevap gerçekten sanırım "duruma göre değişir."

4 Cevap

İşin gerçeği, bazen mysqli hızlıdır ve diğer zamanlarda MySQL API hızlı olmasıdır. Ama fark gerçekten çok küçük. 20 milisaniye - Eğer web üzerinde performans testleri herhangi bakarsanız fark gerçekten sadece 10 olduğunu. Performansını artırmak için en iyi yolu, tablo tasarımı optimize etmektir.

Hızlı elverişli olması için büyük API 'ispat' maksimum güvenlik mysql_real_escape_string için unutmak testlerin çoğu () sorguda kullanılan her bir değişken için aranmalıdır.

Sorguda kullanılan tüm tablolar üzerinde veri değişmeden kalmıştır ancak ve ancak sorgular, sunucu tarafından önbelleğe alınır.

The time you may save with one way vs another: 10 mili saniye

The time you save not having to explain to your client why all his user information ended up on 4chan: Paha

Hazırlanan ifadeler kullanın.

Hazırlanmış deyimleri kullanarak gerçekten kötü bir fikir değildir. Ben mySQL ile son zamanlarda onları kullandım değil, ama ben SQLSERVER ile ağır onları kullandım - ve onlar büyük iş.

PDO kütüphane muhtemelen hazırlanmış deyimi için herhangi bir önbelleği ama veritabanı iradesi yapmaz.

Artı onlar güvenliği için büyük örttüğü gibi. Onun da kodu dışında bu mantık itmek gerçekten güzel - Eğer uygulama boyunca serpilir SQL ile alışkanlık.

Eğer "ikinci pageload çözümlenen" tam olarak ne demek?

Aynı komut tekrar deyimi hazırlamak için yeniden ayrıştırma sorgudan MySQL engel olmayacağını yürütür, her PHP süreç / thread / ziyaretçi, bağlantı başına onun geçerli, yani aynı komut tekrarlanan sorgular için onun çok etkili.

Şimdi, hakkında basit bir sorgu, performans bilge (w / o tekrarlanan sorgular) vs yürütmek + hazırlamak iddia edemez;

Ancak, her komut yürütme karmaşık bir sorgu ayrıştırma mysql kurtarmak için, saklı yordamları kullanmak; Bir sorgu sadece CALL items(date,search_etc,id); yerine SELECT i.id FROM products as p JOIN item_prodct as t ON... JOIN items as i... ON... WHERE ... p.date ... i.search_etc ... olurdu

Sen hazırlanmış tablolar ile saklı yordamları kullanabilirsiniz.