mam mały problem z wyszukiwarką otóż samo wyszukiwanie trwa około 2 sekund co jest dość długo, dlatego moje pytanie czy mój kod da się jakoś zooptymalizować. Tabela liczy około 20 tys rekordów.
Kontroler ->
$array[0] = array('name'=>'programy', 'file'=> $this->Search_model->search_files($id, '8,7,6,18')); // Programy (magiczne 8,7,6 to nazwy kategorii) $array[1] = array('name'=>'spolszczenia', 'file'=> $this->Search_model->search_files($id, '4')); // Spolszczenia $array[2] = array('name'=>'sterowniki', 'file'=> $this->Search_model->search_files($id, '3')); // Sterowniki $array[3] = array('name'=>'gry', 'file'=> $this->Search_model->search_files($id, '5,13,17')); // Gry $array[4] = array('name'=> 'kody do gier', 'file'=> $this->Search_model->search_files($id, '10')); // Kody
Model ->
$query = $this->db->query("SELECT SQL_CALC_FOUND_ROWS files.id, files.*,licenses.name as lname, MATCH(files.name,files.description) AGAINST ('{$string}' IN BOOLEAN MODE) AS score FROM files LEFT JOIN licenses ON licenses.id = files.license WHERE MATCH(files.name,files.description) AGAINST ('{$string}' IN BOOLEAN MODE) and files.main_cat IN ({$cat}) ORDER BY score DESC LIMIT 0,30"); return $query->result_array();
Left join to powiązanie tabeli licencji z tabelą plików. Pytanie czy ktoś coś widzi i poradzi ? Wersja CodeIgnitera 2.02
OKEJ zrobiłem to tak i jest lepiej ma ktoś jeszcze lepszy pomysł ?:
$array = $this->Search_model->search_files($id); // Programy foreach($array as $var) { $cid = $var['main_cat']; //jeśli nie było jeszcze danej kategorii pliku, to ją tworzymy } //dodajemy do kategorii kolejne produkty $categories[$cid]['pliki'][] = array('system_link' => $var['system_link'], 'type' => $var['type'], 'id' => $var['id'], 'description' => $var['description'], 'name' => $var['name'], 'grade'=> $var['grade'], 'downloads' => $var['downloads'], 'pl_link' => $var['pl_link'], 'recomend' => $var['recomend'], 'lname' => $var['lname'], 'language' => $var['language']); } // MODEL: function search_files($string) { $query = $this->db->query("SELECT files.*,licenses.name as lname, MATCH(files.name,files.description) AGAINST ('{$string}' IN BOOLEAN MODE) AS score FROM files LEFT JOIN licenses ON licenses.id = files.license WHERE MATCH(files.name,files.description) AGAINST ('{$string}' IN BOOLEAN MODE) ORDER BY score DESC LIMIT 0,30"); return $query->result_array(); }