Are) s daha hızlı veya veritabanı sorguları (içerir?

5 Cevap php

Bir istemci Ben veritabanında saklanır isterken biz php diziler gibi bazı hayati ve karmaşık yapılandırma verilerini saklamak ısrar ediyor. O i / o veritabanı sorgularını daha hızlı olacağını dosyayı söyleyerek, verimliliği / optimizasyon gündeme getirdi. Ben duydum eminim bir yerde bu dosya içerir PHP aslında yavaş.

Bu konuda herhangi istatistikler gerçek / bilgi?

5 Cevap

Ben performans zorlayıcı bir argüman ya da yolu olduğunu sanmıyorum. Benim Mac, ben aşağıdaki testleri koştu.

İlk 10.000 şey ama bir değişken değildir, bir dosya içerir:

<?php

$mtime = microtime(); 
$mtime = explode(' ', $mtime); 
$mtime = $mtime[1] + $mtime[0]; 
$starttime = $mtime; 

for ($i = 0; $i < 10000; $i++) {
	include("foo.php");
}


$mtime = microtime(); 
$mtime = explode(" ", $mtime); 
$mtime = $mtime[1] + $mtime[0]; 
$endtime = $mtime; 
$totaltime = ($endtime - $starttime); 
echo 'Rendered in ' .$totaltime. ' seconds.'; 
?>

Her zaman çalıştırmak için yaklaşık 0,58 saniye sürdü. (Yani 10.000 içerir var, unutmayın.)

Sonra veritabanını 10.000 kez sorguları başka bir senaryo yazdı. Bu sadece bir SELECT NOW() yok, herhangi bir gerçek veri seçmez.

<?php
mysql_connect('127.0.0.1', 'root', '');
mysql_select_db('test');

$mtime = microtime(); 
$mtime = explode(' ', $mtime); 
$mtime = $mtime[1] + $mtime[0]; 
$starttime = $mtime; 

for ($i = 0; $i < 10000; $i++) {
	mysql_query("select now()");
}


$mtime = microtime(); 
$mtime = explode(" ", $mtime); 
$mtime = $mtime[1] + $mtime[0]; 
$endtime = $mtime; 
$totaltime = ($endtime - $starttime); 
echo 'Rendered in ' .$totaltime. ' seconds.';

?>

Bu komut benim bilgisayarda her zaman çalıştırmak için yaklaşık 0.76 saniye sürer. Açıkçası özel durumda bir fark yaratabilir bir çok faktör vardır, ancak içerir kullanarak karşı MySQL sorguları çalıştıran anlamlı performans farkı yoktur. (Benim test MySQL bağlantı yükü içermiyordu unutmayın - sadece bulunan verileri almak için veritabanına bağlanırken eğer, bu bir fark olur.)

Bu ağır özel duruma göre değişir edecek.

Veritabanı bellek ve / veya önbelleğe aradığınız veri kaydedilmiş ise, o zaman veritabanı I / O oldukça hızlı olmalıdır. Önbelleğe değilse, büyük bir veritabanında gerçekten karmaşık bir sorgu zaman adil biraz alabilir ya da olsa, disk gitmek için vardır.

Dosya I / O akıllı önbelleğe alma mekanizmaları yanı sıra bellekte sık erişilen dosyaları tutmak için de var olsa da, yavaş disk, okuma var.

Gerçek sistem üzerinde profil olacak en kesin olmak olduğunu.

Bu erken optimizasyon oldukça belirgin bir durumdur. Hiç aslında bir üretim ortamında gerçek bir darboğaz olarak tespit ettik sürece bu gibi şeyler optimize kalkmayın.

O (yani PHP optimize etmek için yapmanız gereken very first şeydir Çünkü are? Sağ, bir opcode önbellek kullanarak) APC gibi bir opcode önbellek kullanarak söyledi , paramı içeren dosyada.

Fakat yine de, fark büyük olasılıkla önemsizdir olabilir, bu nedenle 1) az kod ve 2) en az bakım gerektiren bir çözüm bulacaktır. Programcı zaman çok daha pahalı CPU zamanı daha.

Update: Ben 1000 giriş dizi tanımlayan bir PHP dosyası dahil hızlı bir kriter yaptım. Komut olmadan daha APC kullanarak hızlı 5 kez koştu.

(APC veritabanı sorguları için bir şey yapmaz çünkü) benzer bir kriter, (localhost), bir MySQL veritabanı 1000 satır getiriliyor, sadece APC kullanarak daha hızlı% 15 koştu.

APC etkin Ancak, bir kez, no significant difference, bir include dosyası kullanarak ve bir veritabanı kullanılarak arasında yoktu.

Çoğu insan normal bir sayfa için kendi komut içine 10-20 dosyaları dahil olacağı göz önüne alındığında, ben MySQL sorguları daha vardır çok daha hızlı içeren bir his var.

Ama, yanlış olabilir.

Soru bu değerler diğer değişiklikler (hareketli resimler, vb) yapmadan asla değişmeyecek eğer, muhtemelen bir içerme dosyasında saklanmalıdır olmasıdır.

Veri herhangi bir şekilde dinamik ise, bir veri tabanından çekilmiş olmalıdır.

Ben bu kararın performansa dayalı olmalıdır sanmıyorum. Soru kendime sorardım: Bu veriler uygulama tarafından güncellenmiş olacak. Cevap "hayır" ise, bunu uygulamak ve bir dahil dizi olarak kullanmak olacak ne kadar daha hızlı ve daha basit düşünün. Hemen hemen mümkün olan her şey veritabanında saklanan büyük bir sistem ile çalışmak

. Elle geliştirici tarafından yazılmış bir veritabanı değiştirmek yoluyla değiştirilmesi, ve ben bu bilgileri müşteri düşündüren şekilde saklandığı takdirde yol daha kodlama ve yol daha karmaşıklığı yol açmıştır söyleyebilirim olsa bile verileri.

veri sık sık değiştirin ve yine elle müdahale yoluyla değiştirilmelidir ve (örneğin, diğer sistemler için) veritabanında hazır olması gerekmez olmayacak, dizi deneyin. Sen her zaman daha sonra veritabanında koymak ve gerekli tüm SQL yazabilirsiniz.