2015-04-27 3 views
0

Im, используя Yii createCommand QueryBuilder и строя ниже запрос вставки, ниже код работает как заклинание (вставляет 6000 записей за 3 секунды), но через некоторое время его скорость становится очень медленной.Запрос на ввод MySQL медленно замедляется

Мой код:

$taskmodel = TaskModel::model()->findAll($cri); // filtering using some criteria 
$now = new DateTime(); 

foreach($taskmodel as $tsk) { 
    $recall_date = $tsk['recall_date'] == "" ? "null" : '"'.$tsk['recall_date'].'"'; 
    $recall_agent = $tsk['recall_agent_id'] == "" ? "null" : $tsk['recall_agent_id']; 
    $next_date = $tsk['next_action_date'] == "" ? "null" : '"'.$tsk['next_action_date'].'"'; 
    $pc_color = $tsk['postcode_color'] == "" ? "null" : '"'.$tsk['postcode_color'].'"'; 
    $cpc_id = $tsk['crm_campaign_post_code_id'] == "" ? "null" : $tsk['crm_campaign_post_code_id']; 
    $priority = $tsk['priority'] == "" ? 10 : $tsk['priority'];      
    $field1 = "null" ; 
    $field2 = "null" 
    $field3 = "null" 
    $field4 = "null" ; 
    $contact_timezone = $tsk['contact_timezone'] == "" ? "''" : '"'.$tsk['contact_timezone'].'"'; 

    $sql[] = '('.$tsk['crm_task_id'].', '.$tsk['crm_campaign_id'].', "'.$tsk['crm_contact_id'].'", "'.$now->format('Y-m-d H:i:s').'", "'.$now->format('Y-m-d H:i:s').' 
       ", '.$tsk['crm_filter_id'].', '.$tsk['current_status'].', '.$priority.', '.$recall_date.', '.$recall_agent.', '.$next_date. 
       ', '.$pc_color.', '.$cpc_id.', '.$sort.', '.$field1.', '.$field2.', '.$field3.', '.$field4.', '.$contact_timezone.', '.$tsk['is_active'].')'; 
    } 

    if(sizeof($sql) > 0){ 
    $ins ='INSERT INTO crm_pending_task (crm_task_id, crm_campaign_id,crm_contact_id,created,updated,crm_filter_id,  
       current_status,priority,recall_date,recall_agent_id,next_action_date,postcode_color,crm_campaign_post_code_id,sort, 
       field1,field2,field3,field4,contact_timezone,is_active) VALUES '.implode(',', $sql); 
      Yii::app()->db->createCommand($ins)->execute(); 
       } 

я нашел что-то интересное, после вставки 50000 записей становится медленным !!! почему это так ???

Как улучшить скорость запроса вставки до тех пор, пока она не закончит все вставки?

+0

Возможно, это связано с тем, что если сборщик мусора начнет бить. Если это приложение работает в командной строке, то отключить gc будет лучшим выбором. OR может быть медленным в конце mysql из-за индексации, поскольку у вас есть несколько внешних ключей, которые нужно индексировать. –

+0

У вас возникли вопросы? –

+0

Есть ли здесь вопрос, что я не вижу? Хорошо, вы отредактировали. – PHPMan

ответ

0

Я думаю, это потому, что ваш запрос занимает слишком много памяти, и вы меняете местами.

Чтобы освободить память вы shouldt попытаться включить Gc и запустить его в Еогеасп (возможно, не на каждой итерации)

gc_enable(); 
    gc_collect_cycles(); 
0

Возможно, пытаясь вставить меньшие куски в базу данных.

foreach($taskmodel as $tsk) { 
    $recall_date = $tsk['recall_date'] == "" ? "null" : '"'.$tsk['recall_date'].'"'; 
    $recall_agent = $tsk['recall_agent_id'] == "" ? "null" : $tsk['recall_agent_id']; 
    $next_date = $tsk['next_action_date'] == "" ? "null" : '"'.$tsk['next_action_date'].'"'; 
    $pc_color = $tsk['postcode_color'] == "" ? "null" : '"'.$tsk['postcode_color'].'"'; 
    $cpc_id = $tsk['crm_campaign_post_code_id'] == "" ? "null" : $tsk['crm_campaign_post_code_id']; 
    $priority = $tsk['priority'] == "" ? 10 : $tsk['priority'];      
    $field1 = "null" ; 
    $field2 = "null" 
    $field3 = "null" 
    $field4 = "null" ; 
    $contact_timezone = $tsk['contact_timezone'] == "" ? "''" : '"'.$tsk['contact_timezone'].'"'; 

    $sql[] = '('.$tsk['crm_task_id'].', '.$tsk['crm_campaign_id'].', "'.$tsk['crm_contact_id'].'", "'.$now->format('Y-m-d H:i:s').'", "'.$now->format('Y-m-d H:i:s').' 
       ", '.$tsk['crm_filter_id'].', '.$tsk['current_status'].', '.$priority.', '.$recall_date.', '.$recall_agent.', '.$next_date. 
       ', '.$pc_color.', '.$cpc_id.', '.$sort.', '.$field1.', '.$field2.', '.$field3.', '.$field4.', '.$contact_timezone.', '.$tsk['is_active'].')'; 
} 


    $recordCount = sizeof($sql); 
    $sliceSize = 250; 

    for($x = 0; $x < $recordCount; $x += $sliceSize) { 

     $ins = sprintf(' 
      INSERT INTO 
       crm_pending_task 
        (
         crm_task_id, crm_campaign_id, crm_contact_id, created,updated, 
         crm_filter_id, current_status, priority, recall_date, recall_agent_id, 
         next_action_date, postcode_color, crm_campaign_post_code_id, sort, 
         field1, field2, field3, field4, contact_timezone, is_active 
        ) 
      VALUES 
       %s; ', implode(',', array_slice($sql, $x, $sliceSize)); 

     Yii::app()->db->createCommand($ins)->execute(); 
    } 

} 
+0

Я нашел что-то интересное, после вставки 50000 записей он становится медленным !!! почему это так ??? –

Смежные вопросы