nasıl MySQL ve PHP hızlandırmak için?

6 Cevap php

PHP ve MySQL kullanarak ve büyük veri (scintific araştırma için kayıtların yaklaşık 2 milyon) uğraşıyorum benim localhst bir script geliştiriyorum

Bazı sorgular I (verileri analiz etmek ve bazı verileri hazırlamak için) hayatta bir kere aramak gerekiyor; örneğin çok uzun zaman alır ancak: şimdi benim komut fazla 4 saat süreyle bazı veri analizi

Ben bir uzman değilim, benim veritabanı optimizasyonu bazı sorunlar olabilir biliyordu

for example I just figured out that "indexing" can be useful to speed up the queries however even with indexing some columns my script is still very slow

(PHP ve MySQL) benim komut hızlandırmak için nasıl bir fikir

Ben bir sunucu paketi olarak XAMPP kullanıyorum

Çok teşekkürler yardım için

saygılarımla

Güncelleme 1:

part of my slow script which takes more than 4 hours to process

$sql = "select * from urls";//10,000 record of cached HTML documents
$result = $DB->query($sql);
while($row = $DB->fetch_array($result)){
$url_id = $row["id"];
$content = $row["content"];

$dom = new DOMDocument();
@$dom->loadHTML($content);
$xpath = new DOMXPath($dom);
$row = $xpath->evaluate("/html/body//a");

for($i = 0; $i < $row->length; $i++) {
     // lots of the code here to deal with the HTML documents and some update and insert and select queries which query another table which has 1 million record
}


Güncelleme 2:

Benim quires in "JOIN" ya da hatta "IN" yok

onlar çok basit sorgular

ve bilmiyorum! ve ben yavaşlık neden olur hangi bilmek nasıl bilmiyorum?

Bu PHP veya MYSQL nedir?

6 Cevap

Her şeyden önce, verimli optimize edebilmek için, bunu zaman ayırdığınız bilmek gerekir:

  • PHP çok hesaplamalar yapıyor?
  • Eğer çok fazla SQL sorguları var?
  • do you have SQL queries that take too much time ?
    • Evetse, hangileri?
  • nerede komut harcama zaman?

Bu bilgiler ile, sonra anlamaya deneyebilirsiniz:

  • if you can diminish the number of SQL queries
    • Eğer tekrar tekrar aynı sorguyu yapıyorsun örneğin, belli ki zaman harcıyorsun
    • başka bir fikir eğer mümkünse, sorguları "yeniden toplamak" için; Örneğin, bunun yerine tüm bir satır geri almak 10 Sorgu 10 satır, almak için tek bir sorgu kullanın.
  • if you can optimize queries that take too long
    • indeksleri kullanılarak ya - yararlı olanları genellikle katılır ve kullandığınız koşullara bağlı
    • onlar "kötü" ya da eğer, sorguları yeniden yazma
    • Select tabloların optimizasyonu hakkında, size bir göz atabilirsiniz: 7.2. Optimizing SELECT and Other Statements
  • if PHP is doing too much calculations, can you have it make less calculations ?
    • Belki tekrar tekrar benzer şeyler hesaplamaya değil?
    • Ya da daha verimli sorguları kullanarak?
  • PHP zaman alıyor, ve SQL server paralellik (aynı anda birkaç hesaplamaları başlatılması) kullanılarak, aşırı yüklü değilse de her şeyi hızlandırmaya yardımcı olabilir.

Still : this is quite a specific question, and the answers will be probably be pretty specific too -- which means more informations might be necessary if you want more than general answer...


Edit after your edits

Eğer sadece basit sorgular gibi şeyler ... Belki biraz daha kolay olabilir.

  • First of all : you need to identify the kind of queries you are doing.
    • Ben tüm sorguları, sorgularda bazı "türleri" belirlemek için, tahmin ediyorum.
    • Örneğin: "select * from a where x = 12" ve "select * from a where x = 14" aynı tipte: Aynı seçin, aynı masa, aynı yerde fıkra - sadece değer değişiklikleri
  • once you know which queries are used the most, you'll need to check if they are optimized : using EXPLAIN will help
    • (if needed, I'm sure some people will be able to help you understand its output, if you provider it alongside the schema of you DB (tables + indexes))
    • Gerekirse: sağ dizinleri oluşturmak - bu zor / belirli bir kısmının tür ^ ^
    • Bu sorgu sayısını azaltarak yararlı olabilir bu sorguları için de ...
  • when you're done with queries often used, it's time to go with queries that take too long ; using microtime from PHP will help you find out which ones those are


Before that, to find out if PHP is working too much, or if it's MySQL, a simple way is to use the "top" command on Linux, or the "process manager" (I'm not on windows, and don't use it in english -- the real name might be something else).

PHP% 100 CPU yiyor, sizin suçlu var. MySQL bütün CPU yiyor ise, siz de suçlu var.

Eğer onlardan biri çok çalıştığını biliyor, bu bir ilk adım: İlk optimize etmek için biliyorum.


I see from your portion of code that your are :

  • tek 10.000 elemanları biri geçiyor - 2 veya daha fazla dilim bu bölmek kolay olmalı
  • PHP-tarafında bazı CPU yemek olabilir DOM ve XPath kullanarak

Bir çok-çekirdekli işlemci varsa, bir fikir (PHP CPU çok yeme olduğunu görürsem ben denemek istiyorum) parallelize için istiyorsunuz.

Örneğin, aynı anda çalışan PHP script iki örneğini olabilir:

  • one that will deal with the first half of the URLs
    • Bunun için SQL sorgu "select * from urls where id < 5000" gibi olacak
  • and the other one that will deal with the second half of the URLs
    • Onun sorgusu "select * from urls where id >= 5000" gibi olacak

Sen ağa (muhtemelen bir sorun) ve veritabanı (a database knows how to deal with concurrency, and 2 scripts using it will generally not be too much) biraz daha eşzamanlılık alacak, ama aynı zamanda belgelerin neredeyse iki aynı miktarda işlemek mümkün olacak.

Eğer 4'te adresler-list bölme, 4 işlemci varsa (or even more ; find out by trial and error) parçalar çok yapardı.

Sorgu bir tablo olduğunu ve hiçbir gruplandırma veya sipariş olduğundan, sorgu yavaş olası değildir. Ben konu içerik alanlarının büyüklüğü ve sayısı bekliyoruz. Bu sizin veritabanı bir web sayfasının tamamını HTML depolamak ve daha sonra sayfada değerlerin bir çift değiştirmek istediğiniz her zaman dışarı çekerek anlaşılmaktadır. Bu mümkünse kaçınılması gereken bir durumdur.

(Örneğin BLAST gibi) Çoğu bilimsel webapps csv gibi sınırlandırılmış bir metin dosyası olarak veri ihracat seçeneği var. Bu sizin için durum ise, csv veri alanının başına bir sütun var ki, sizin url tablosunu yeniden düşünebilirsiniz. Yerine, PHP içine tüm url tabloyu çekerek erişen ve her url kayıt için bir veya daha fazla diğer kayıtları çekerek ve ardından tablo güncelleme SQL tamamen bunları yapmak mümkün olacak gibi Sonra güncelleştirme sorguları önemli ölçüde daha hızlı olacak.


Eğer bir tarayıcı kolayca içeriğini dökümü böylece assumably web sayfalarında gibi verilerin saklandığı. Ben önerdim gibi veritabanı şemasını değiştirmek, size çıktı onu istediğinizde içine veri takabilirsiniz bir web sayfası şablonu yazmak gerekir.

Sorgular ve tablo yapıları bilmek daha kolay olurdu.

Eğer operatör IN varsa onlara çek vermek cant. MySQL orada çok yavaş eğilimindedir. Ayrıca çalıştırmayı deneyin

EXPLAIN yourquery;

ve idam nasıl görüyoruz. Bazen sıralama çok fazla zaman alır. Olmayan dizin sütunları sıralama önlemek için deneyin.

Dizinleri kullanmıyorsanız bu temel sorun olabilir. Daha birçok optimizasyon ipuçları ve püf noktaları vardır. Iyi yani senin yavaş sorgu göstermek olacaktır. Herhangi bir veri girişi olmadan yardım etmek mümkün değildir. Indeksler ve doğru katılır gerçekten bu kadar hızlandırabilirsiniz.

Sorguları aynı veri dönecektir Eğer dosyada veya bunları bellekte saklamak ve sadece onları bir kez yapabilirsiniz.

Kayıtları 2 milyon fazla değildir.

Eğer optimize edebilirsiniz önce, darboğaz nerede olduğunu bulmak gerekir. Eğer test amaçlı, küçük bir veri kümesi üzerinde komut dosyası çalıştırabilir miyim?

Bu durumda, böyle bir test ayarladı, ve sonra kod profil olmalıdır. Bu tür Xdebug gibi özel bir profilcisini kullanmak ya, veya yapılandırmak için çok zor bulmak (gerçekten karmaşık değil, ama zaten derin sonunda biraz senin gibi ses) varsa, olabilir manuel yaklaşım ile daha rahat hissediyorum. Bu sonuç dışarı baskı, sonra kod parçaları önce bir çekim başlıyor ve sonra durdurma anlamına gelir. Daha sonra yavaş hangi bölümünün daraltmak.

O var, biz daha spesifik cevaplar verebilir, ya da belki de ne size açık olacaktır.

iç birleşimler sol daha çabuk ya da sağ katıldı

Her zaman sonra geçiyor ve katılır hakkında düşünmeye benim sorguları hızlandı.

vb kapatabilirsiniz ayarları için mysql config bir göz var