Neden mysql resultset'de üzerinden bu döngü yavaş?

3 Cevap php

$ Res bütün döngü 61S alır 488k yaklaşık satır içerir! Bu döngü başına 1.25ms bitti! Ne bütün bu zaman alıyor?

while($row = $res->fetch_assoc())
{
    $clist[$row['upload_id']][$row['dialcode_id']][$row['carrier_id']]['std'] = $row['cost_std'];
    $clist[$row['upload_id']][$row['dialcode_id']][$row['carrier_id']]['ecn'] = $row['cost_ecn'];
    $clist[$row['upload_id']][$row['dialcode_id']][$row['carrier_id']]['wnd'] = $row['cost_wnd'];
    $dialcode_destination[$row['upload_id']][$row['carrier_id']][$row['dialcode_id']]['other_destination'] = $row['destination_id'];
    $dialcode_destination[$row['upload_id']][$row['carrier_id']][$row['dialcode_id']]['carrier_destination'] = $row['carrier_destination_id'];
}

Şimdi 10 satır, daha küçük diziler ve resultset değil hızlı ama yine de daha iyi bir 30 kat daha yüksektir (0.041ms) performansı.

while($row = $res->fetch_assoc())
{
    $customer[$row['id']]['name'] = $row['name'];
    $customer[$row['id']]['code'] = $row['customer'];
}

3 Cevap

488k bir çok veri anlamına gelir, satır bir çok şey var. Bir dizideki sopa fazla öğe, daha fazla bellek tahsis edilecek olan ve uzun elementin arama alır.

Eğer aynı kod neredeyse yarım milyon kez infaz konum olarak, erişen dizi optimize değer olurdu:

... {
  $myclist =& $clist[$row['upload_id']][$row['dialcode_id']][$row['carrier_id']];
  $myclist['std'] = $row['..'];
  $myclist['ecn'] = $row['..'];
  ...
  $dest =& $dialcode_destination[$row['upload_id']][$row['carrier_id']][$row['dialcode_id']];
  $dest['..'] = $row['..'];
  $dest['..'] = $row['..'];
}

Sadece dizi yapıyoruz bu şekilde yerine defalarca kez aramalarını ve muhtemelen önemli ölçüde zamanını azaltacaktır. Bir dizide birçok şey tutunan olsa, ne olursa olsun, hızlı olmak için gitmiyor.

Uzun vadede, en iyi bahis olarak veritabanı ve sadece kapmak bit veri bırakmak ve (eğer / ortalama / ne olursa olsun toplamak için çalışıyorsanız, sizin için ağır kaldırma yapmak veritabanı ya da) onları gerektiğinde .

I suspect tüm ne zaman alıyor, bazı (veya tüm) boyutları dize alanlarından kilitlenmiştir ediliyor 4-boyutlu diziler, kendilerini {elde edilecek olan bu değerlere sürekli erişim olduğunu [(1)]} ...

Ben ciddiye yeniden öneririm:

  1. Eğer bellekte tüm bu ihtiyaç olup olmadığı
  2. eğer öyleyse, en iyi veri yapısı optimal erişim için ne olurdu

Ne bu konuda:

$cache = array();
while($row = $res->fetch_assoc())
{
    $key = $row['upload_id']."\n".$row['dialcode_id']."\n".$row['carrier_id'];
    $key1 = "1\n$key";
    if (!array_key_exists($key1, $cache))
      $cache[$key1] = &$clist[$row['upload_id']][$row['dialcode_id']][$row['carrier_id']];

    $ref = &$cache[$key1];
    $ref['std'] = $row['cost_std'];
    $ref['ecn'] = $row['cost_ecn'];
    $ref['wnd'] = $row['cost_wnd'];

    $key2 = "2\n$key";
    if (!array_key_exists($key2, $cache))
      $cache[$key2] = &$dialcode_destination[$row['upload_id']][$row['carrier_id']][$row['dialcode_id']]

    $ref = &$cache[$key2];
    $ref['other_destination']   = $row['destination_id'];
    $ref['carrier_destination'] = $row['carrier_destination_id'];
}