2016-09-29 4 views
1

Я пытаюсь выполнить поиск с использованием codeigniter быстрее, я использую библиотеку разбиения на страницы, и мне нужно подсчитать записи, возвращенные из запроса, на таблицу, содержащую более 1,2 миллиона записей ... Функция num_rows() очень медленная (примерно 3 секунды)Codeigniter count too slow - pagination

public function search() 
{ 


    $this->output->enable_profiler(TRUE); 

    $data = array(); 

    $query = $this->input->get('query'); 
    $filter = $this->input->get('f'); 
    $hd = $this->input->get('hd'); 


    if($hd == 'true'): 
     $this->db->where('hd',1); 
    endif; 


    $request = urldecode($query); 

    $where = "MATCH (name,tags) AGAINST ('".$request."' IN BOOLEAN MODE)"; 
    $this->db->where($where); 

    $get_vars = $this->input->get(); 

    if(is_array($get_vars) && ($this->input->get('query'))): 
     $config['suffix'] = '?'.http_build_query($get_vars,'', '&'); 
    endif; 

    $config['base_url'] = base_url('search'); 
    $config['per_page'] = 8; 
    $config['num_links'] = 8; 
    $config['full_tag_open'] = '<div class="pagination"><ul>'; 
    $config['full_tag_close'] = '</ul></div><!--pagination-->'; 
    $config['first_link'] = '&laquo; First'; 
    $config['first_tag_open'] = '<li class="prev page">'; 
    $config['first_tag_close'] = '</li>'; 
    $config['last_link'] = 'Last &raquo;'; 
    $config['last_tag_open'] = '<li class="next page">'; 
    $config['last_tag_close'] = '</li>'; 
    $config['next_link'] = 'Suivant &rarr;'; 
    $config['next_tag_open'] = '<li class="next page">'; 
    $config['next_tag_close'] = '</li>'; 
    $config['prev_link'] = '&larr; Précédent'; 
    $config['prev_tag_open'] = '<li class="prev page">'; 
    $config['prev_tag_close'] = '</li>'; 
    $config['cur_tag_open'] = '<li class="active"><a href="">'; 
    $config['cur_tag_close'] = '</a></li>'; 
    $config['num_tag_open'] = '<li class="page">'; 
    $config['num_tag_close'] = '</li>'; 

    $query = clone $this->db; 
    $config['total_rows'] = $query->get('videos')->num_rows();  
    $config['segment'] = $this->uri->segment(2); 
    $this->pagination->initialize($config); 

    $data['results'] = $this->db->get('videos',$config['per_page'],$this->uri->segment(2))->result(); 

    $this->load->view('search',$data); 
} 

Какие-либо решения?

+1

http://stackoverflow.com/questions/12864557/select-count-vs-mysql-num-rows – sintakonte

+0

Вы можете просто получить данные, поместить их в таблицу и использовать разбиение на страницы js. –

+1

'num_rows()' вероятно, извлекает каждую запись из БД и использует функцию 'count()' PHP в наборе результатов. Самая эффективная вещь, которую вы можете сделать, - запустить выделенный 'select count (*) как total_videos из запроса видео и использовать это значение. – MonkeyZeus

ответ

1

Как следует из комментариев от @MonkeyZeus, производительность улучшится с помощью функции SQL count(). Codeigniter предоставляет это через функцию Query Builder count_all_results($table = '', $reset = TRUE).

Функция будет учитывать любые ограничители, которые вы положили на место, например. where, or_where, like и т.д.

Изменить этот

$query = clone $this->db; 
$config['total_rows'] = $query->get('videos')->num_rows(); 

к этому

//next line is not needed because the query will not be reset by the row count 
//$query = clone $this->db; 
$config['total_rows'] = $this->db->count_all_results('videos', FALSE); 

мне было бы интересно узнать, как изменения времени выполнения.

+0

@VeenZ Не могли бы вы проверить ваши запросы и узкие вниз, какой запрос замедляет работу? Если вам нужна помощь с правильным бенчмаркингом, дайте мне знать. – MonkeyZeus

+0

@VeenZ нет, спасибо, я не пользуюсь Skype. Вы должны попробовать опубликовать новый вопрос, спрашивающий о оптимизации запросов, потому что вам нужно добавить или исправить некоторые индексы или перестроить запрос. – MonkeyZeus