하드 스크립트를 최적화해야합니다. 현재 런타임 ~ 5 시간.하드를 최적화하는 방법은 무엇입니까?
테이블 파일에서 스크립트 찾기 중복은 md5 해시로 테이블 폴더를 사용합니다.
DB : MySQL, 서버 : 로컬.
컴퓨터 : AsRock Z77 pro4, 인텔 코어 i7 3770, 12Gb 램.
코드 :
// find file-duplicates by md5-hash
$current_folder_id = 1;
$select_ids_files = array();
$folders = $this->db->query("
SELECT `folder_id`
FROM `sc_folders`
")->result();
if (!$folders)
exit('folders not found');
$current_files_data = $this->get_files_by_folder_id($current_folder_id);
if (!$current_files_data) {
exit('!current_files_data');
}
foreach ($folders as $folder) {
$files = (object)array();
$files = $this->get_files_by_folder_id($folder->folder_id);
if (!$files)
continue;
if (count($files) > count($current_files_data)) {
$gl_arr = &$files;
$nogl_arr = &$current_files_data;
} else {
$gl_arr = &$current_files_data;
$nogl_arr = &$files;
}
foreach ($gl_arr as $key => $value) {
foreach ($nogl_arr as $k => &$v) {
if ($value->file_hash == $v->file_hash && $value->file_id != $v->file_id) { // an important place for optimize
$select_ids_files[] = $v->file_id;
}
}
}
}
print_r($select_ids_files);exit; // id duplicates records
테이블 폴더 : folder_id, 폴더 _. (~ 45 레코드)
테이블 파일 : file_id, file_hash, file_folder_id, file_name. (~ 1,400,000 개 레코드)
어느 부분이 항상 걸립니까? 프로파일 링을 시도하거나 적어도 여러 지점에서 시간을 반향하여 최적화 할 부분을 확인하십시오. – Anigel
@Anigel'if ($ value-> file_hash == $ v-> file_hash && $ value-> file_id! = $ v- > file_id)'= 99 % 시간. – iproger
모든 파일 해시가 데이터베이스에 저장되어있는 것처럼 보입니다. 단지 SQL 쿼리에서 복제 해시를 직접 선택하지 않는 이유는 각각 140 만 개의 루프 대신에 (해시)> 1 인 파일 그룹에서 선택하십시오. 어느 루프 1.4 백만 가지 – Anigel