Zend Framework ile büyük mysql tablo

2 Cevap php

Ben veri üzerinde 4.000.000 ile bir mysql tablo var; de sorun BAZI sorguları ÇALIŞMAK ve arama terimi ben aşağıdaki hatayı alıyorum daha tablodaki verilerin büyük bir hacme sahip olup BAZI o, arama terimi bağlıdır YAPMAYIN olduğunu:

Fatal error: Allowed memory size of 1048576000 bytes exhausted (tried to allocate 75   bytes) in /home/****/public_html/Zend/Db/Statement/Pdo.php  on line 290

Etkin meta için, ben o table.The siteden tüm alanları üzerinde dizin var ben şu anda 2GB RAM ile özel bir sunucu üzerinde çalışan Zend Framework önbelleğe sahip.

Ben de hafıza limitini kurdum: ini_set ("memory_limit", "1000M");

Ben optimize edebilirsiniz başka şeyler?

Bu ben anda kullanarak sorgu türleri şunlardır:

            $do = $this->select()
              ->where('branche LIKE ?','%'.mysql_escape_string($branche).'%')
              ->order('premium DESC');  

        }


        //For name
        if(empty($branche) && empty($plz))
        {
              $do = $this->select("MATCH(`name`) AGAINST ('{$theString}') AS score")
              ->where('MATCH(`name`) AGAINST( ? IN BOOLEAN MODE)', $theString)
              ->order('premium DESC, score');           
        }

Ve bir başka birkaç, ama onlar hemen hemen aynıdır.

Saygılarımızla

/ / LE

ZEND_PAGINATOR KODU

        $d = $firmen->doSearch($finalType,$theKeyword,$thePLZ,$theBranche,false,false,false,$theOrder);
    if ($d !== false) {
        $paginator = Zend_Paginator::factory($d);
        $paginator->setItemCountPerPage(5)
                  ->setPageRange(10)
                  ->setCurrentPageNumber($pag);

        $this->view->data = $paginator;

/ / MySQL sonuçları açıklayabilir

mysql> EXPLAIN select * from `wirtscha_ksw`.`firmen` WHERE `name` LIKE '%gmbh%';ERROR  2006 (HY000): MySQL server has gone away
No connection. Trying to reconnect...
Connection id:    32911
Current database: *** NONE ***

 +----+-------------+--------+------+---------------+------+---------+------+---------+-------------+
 | id | select_type | table  | type | possible_keys | key  | key_len | ref  | rows    |   Extra       |
 +----+-------------+--------+------+---------------+------+---------+------+---------+-------------+
 |  1 | SIMPLE      | firmen | ALL  | NULL          | NULL | NULL    | NULL | 3749155 |   Using where | 
 +----+-------------+--------+------+---------------+------+---------+------+---------+-   ------------+
 1 row in set (0.03 sec

2 Cevap

Eğer gerçekten bir kerede tüm kayıtları yüklemek gerekiyor mu? Ben bu sorgularda SINIRI kullanmanızı tavsiye ederim. Eğer veri sunmak gerekiyor bu durumda, aynı zamanda Zend_Paginator kullanmayı düşünebilirsiniz.

UPDATE: sen alıyorsun yaklaşım, büyük resultsets ile overkilling tüm sonuçları, Zend_Paginator geçmektir. Bu durumda bir daha optimal yaklaşım sadece sorgu geçmek için, ve daha sonra bu kayıtların sayısını sayma ve başına sonuç sayısına sorgu sınırlama içerir (sayfayı görüntülemek için gereken, yalnızca veri getiriliyor ilgilenir sayfa), örneğin:

$paginator = new Zend_Paginator(
    // $query is an instance of Zend_Db_Select
    new Zend_Paginator_Adapter_DbSelect($query);
);
$paginator->setItemCountPerPage(5)
          ->setPageRange(10)
          ->setCurrentPageNumber($pag);

Zend paginator bellek ayrıntılı olarak--box-out olduğu gibi. Zaten 512M için varsayılan memory_limit x4 artırmak için yaşadım ve canlı versiyonu sonuçta olacak kadar büyük olmayan bir test veritabanı ile bulunuyor.