Проблема подкачки данных

Тема в разделе "PHP", создана пользователем Demeus, 25 май 2011.

  1. Demeus

    Demeus New Member

    Регистр.:
    18 сен 2009
    Сообщения:
    47
    Симпатии:
    0
    Есть таблица mysql в которой хранятся урлы к xml файлам
    Опрос этих урлов выполняется по крону, каждые 30 минут, порциями по 20 записей, данные записываются в БД для дальнейшего вывода на сайте. Мой хостер говорит “при работе скрипта процесс MySQL сразу "отъедает" до 100% ресурсов процессора.”
    В скрипте всего 2 селекта и в зависимости от условия insert или update.
    Что может так прогружать проц, и можно ли это как то решить?
     
  2. zerg

    zerg Administrator Команда форума

    Регистр.:
    18 июл 2008
    Сообщения:
    4.254
    Симпатии:
    3
    Ответ: Проблема подкачки данных

    А не проще ли сразу получить а не по 20 записей таскать. И если ты инсертишь в таблицу, используешь то есть как лог то можно поставить движок myisam. Проставь индексы в поля которые селектишь.
     
  3. Demeus

    Demeus New Member

    Регистр.:
    18 сен 2009
    Сообщения:
    47
    Симпатии:
    0
    Ответ: Проблема подкачки данных

    Если выбирать сразу все, то скрипт работает долго, а что за движок myisam?
    Тип таблицы у меня стоит MyISAM это одно и то же или разные вещи?
     
  4. zerg

    zerg Administrator Команда форума

    Регистр.:
    18 июл 2008
    Сообщения:
    4.254
    Симпатии:
    3
    Ответ: Проблема подкачки данных

    Селекты быстрее работают в инодб, инсерты в майисам.
     
  5. Demeus

    Demeus New Member

    Регистр.:
    18 сен 2009
    Сообщения:
    47
    Симпатии:
    0
    Ответ: Проблема подкачки данных

    Получается, что ничего менять не надо, но проблема все равно осталась...
     
  6. zerg

    zerg Administrator Команда форума

    Регистр.:
    18 июл 2008
    Сообщения:
    4.254
    Симпатии:
    3
    Ответ: Проблема подкачки данных

    Поставь значит больше запросов за раз. Может ты создаешь не 1 а много подключений к БД. И покажи как выглядят запросы.

    Индесы проставил?
     
  7. Demeus

    Demeus New Member

    Регистр.:
    18 сен 2009
    Сообщения:
    47
    Симпатии:
    0
    Ответ: Проблема подкачки данных

    Вот код подкачки
    [HIDE="30"]
    PHP:
    <?php 
    ob_implicit_flush
    (true);
    error_reporting(E_ALL); 
    ini_set("display_errors"1); 
    set_time_limit(0);
    require_once(
    "const.php");
    require 
    'config.php'
    require_once(
    "function_main.php");


    function 
    get_sec(){
        
    $mtime=microtime();
        
    $mtime=explode(" ",$mtime);
        
    $mtime=$mtime[1]+$mtime[0];
        return 
    $mtime;
    }
    $start_time=get_sec();

    $result mysql_query("
            SELECT 
                site.id, site.name, site.url, site.logo, xml_url.x_url, xml_url.site, xml_url.xid
            FROM site
            INNER JOIN xml_url ON (site.xml_id = xml_url.xid)
            WHERE xml_url.active = 1 order by site.id   LIMIT 0 , 20 "
    );

    $i 1;
    while(
    $r=mysql_fetch_assoc($result)) {
        
    $url trim($r['x_url']);
        
    $names $r['name'];
        
    $site_id $r['id'];
        
        
    $xml simpleXML_load_file($url,"SimpleXMLElement"); 
        


        if(
    $xml ===  FALSE) {
                continue;
            } 
        else {

            foreach (
    $xml->DEAL as $item) {
                
    $IDabs($item->ID);
                
    $url=mysql_escape_string($item->URL);
                
    $city =choose_city($item->CITY);
                
    $image=$item->IMAGE;
                
    $sort=sort_city($city);


                
    $deal_end=$item->DEAL_END;
        
                if (
    $ID==""){
                    
    #если нет ID 
                    
    $ID0;
                    
    $table mysql_query("SELECT `id` FROM table WHERE  site_name ='".$names."' and url='".$url."'  " );
                    
    $num_rows mysql_num_rows($table);
                    if(
    $num_rows>0){
                        
    mysql_query("
                            UPDATE 
                              `table`  
                            SET 
                              `image` = '
    $image',
                               sort= 
    $sort,
                            WHERE
                              url='"
    .$url."' and  site_name = '".$names."'") ;

                        }    
                        else{

                            
    mysql_query"
                            INSERT INTO
                                  `table`
                                (
                                  `id`,site_id, site_name, shop,`url`,`image`
                                )
                                    VALUE (
    $ID$site_id, '$names', '$shop','$url','$image' );");

                            }
                    
                
                }
                else{
                    
    #если есть ID 
                    
    $table mysql_query("SELECT `id` FROM table WHERE    id = ".$ID."  and  site_name ='".$names."'" );
                    
    $num_rows mysql_num_rows($table);
                    if(
    $num_rows>0){
                        
    mysql_query("
                            UPDATE 
                              `table`  
                            SET 
                              
                              `image` = '
    $image',
                               sort= 
    $sort,
                        
                            WHERE
                               id='"
    .$ID."' and  site_name = '".$names."'") ;

                        }    
                        else{

                            
    mysql_query"
                            INSERT INTO
                                  `table`
                                (
                                  `id`,site_id , site_name,`image`, sort
                                )
                                    VALUE (
    $ID$site_id, '$names', '$image', $sort );");

                            }
                }
                
    $i++;
             }    
        }
        
    }


            

    unset(
    $xml); 
    $exec_time=get_sec()-$start_time;
    printf("<!--Execution time %f sec.-->",$exec_time);      
    ?>
    [/HIDE]
     
  8. zerg

    zerg Administrator Команда форума

    Регистр.:
    18 июл 2008
    Сообщения:
    4.254
    Симпатии:
    3
    Ответ: Проблема подкачки данных

    А зачем "order by site.id", он же по умолчанию должен выводить в таком порядке?

    Поставь индексы на поля xml_id, xid, site_name, url, active, id которые используются во WHERE и JOIN.

    Где у тебя идет закрытие соединения с БД?
     

Поделиться этой страницей