2012-10-23 1 views
3

좋아, 그래서 사람들이 시리즈에서 선택하여 우편 주소 데이터베이스를 쿼리 할 수있는 웹 시스템 (codeigniter & mysql에서 빌드 됨)을 얻었습니다. 그들이 원하는 선택, 꽤 표준적인 물건에 도착할 때까지 형태의. 그런 다음 해당 정보를 구매하고 해당 시스템을 통해 다운로드 할 수 있습니다.mysql 데이터베이스 쿼리에서 PHP를 사용할 때 CSV 내보내기 속도 향상

쿼리가 매우 빠르게 실행되지만 데이터베이스에 해당 쿼리를 적용하고이를 csv로 내보내는 경우 데이터 세트가 30,000 레코드 마크 (각 행의 약 40 개 열 중 약 20 개가 모두 셀 당 평균 20 자의 데이터로 채워짐) csv로 내보내려면 5 분 정도 걸릴 수 있습니다.

그래서 제 질문은 느려지는 주된 원인은 무엇입니까? 쿼리의 데이터 결과가 너무 커서 메모리 문제가 발생합니까? 따라서 프로세스에 더 많은 메모리를 허용해야합니까? 또는, 내가하지 않는 mysql 쿼리에서 csv로 내보내는 훨씬 효율적인 방법이 있습니까? 쿼리의 내용을 임시 테이블에 저장하고 임시 테이블을 CSV로 내보내는 것이 좋습니까? 아니면이 모든 잘못을 저질렀습니까? 또한, 그것이 내가 결과 집합을 저장하는 방식으로 인해이 금지에 대한 Codeigniters 액티브 레코드를 사용하고 있다는 사실입니까?

의사 코드 :

$query = $this->db->select('field1, field2, field3')->where_in('field1',$values_array)->get('tablename'); 
$data = $this->dbutil->csv_from_result($download_query, $delimiter, $newline); // the some code to save the file 
$this->load->helper('download'); 
force_download($filename, $filedata); 

어떤 조언을 환영합니다! 읽어 주셔서 감사합니다!

+0

수출 프로세스의 프로그램 흐름에 대한 의사 코드 예제를 제공해 주시겠습니까? – CrazyWebDeveloper

+0

물론 가능합니다! 기본적으로 다음과 같습니다. $ query = $ this-> db-> select ('field1, field2, field3') -> where_in ('field1', $ values_array) -> get ('tablename'); $ data = $ this-> dbutil-> csv_from_result ($ download_query, $ delimiter, $ newline); // 파일을 저장하는 코드 $ this-> load-> helper ('download'); force_download ($ filename, $ filedata); 제대로 스타일을 지정할 수있는 코드가 없습니다. 죄송합니다! – John

+0

@ John은 코드를 원래 게시물에 넣었습니다. – manuerumx

답변

2

, 당신은 기본적으로 three options for exporting CSV using PHP 있습니다 디스크에

  • - 브라우저
  • 직접 일반적으로 가장 빠른 옵션 - 일반적으로 가장 느린 옵션 메모리에
  • 귀하의 경우에는 내장 된 Codeigniter CSV 기능을 건너 뛰고 직접 브라우저로 스트리밍 해보십시오 (전체 예제는 위의 링크 참조).

  • +0

    정말 대단합니다. 정말 고마워요! – John

    0

    만 기록 * 40 열 * 20 바이트 = 24,000,000 바이트

    이 바쁜 공유 서버 인 경우

    는 나는이 디스크 I/O 병목 상상할 수 있습니다. Windows 기반 서버라면 속도를 늦추려면 페이징이 발생할 수 있습니다.

    디스크를 건너 뛰고 네트워크에 직접 쓰는 것이 좋습니다. 잠시 CodeIgniter를 무시