가능한 한 최선을 다해서 PHP를 가능한 한 많이 만들어내는 것입니다. 항상 CSV를로드하거나 내보내는 경우입니다.
아래에는 2600 만 행의 학생 테이블이 있습니다. 200K 행을 내보낼 것입니다. 허락하면, 칼럼 수는 학생 테이블에서 작습니다. 주로 학생들을위한 캠퍼스 정보로 수행하는 다른 것들을 테스트합니다. 그러나 당신은 내가 바라는 생각을 얻을 것이다. 문제는 귀하의 컴퓨터에 걸리는 시간입니다.
... 그런 다음 레코드가 필터링 규칙을 "통과"하는지 확인하십시오.
PHP가없는 이론에서는 db 엔진을 통해 자연적으로 발생할 수 있습니다. PHP가 없으면 진언이어야합니다. 그러나 아직 결정되지 않았습니다. 요점은, PHP 방정식 처리를 얻는 것입니다. PHP는 많은 것들이 있습니다. DB 처리에서 적절한 파트너가 아닙니다.
select count(*) from students;
-- 26.2 million
select * from students limit 1;
+----+-------+-------+
| id | thing | camId |
+----+-------+-------+
| 1 | 1 | 14 |
+----+-------+-------+
drop table if exists xOnesToExport;
create table xOnesToExport
( id int not null
);
insert xOnesToExport (id) select id from students where id>1000000 limit 200000;
-- 200K rows, 5.1 seconds
alter table xOnesToExport ADD PRIMARY KEY(id);
-- 4.2 seconds
SELECT s.id,s.thing,s.camId INTO OUTFILE 'outStudents_20160720_0100.txt'
FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY '\r\n'
FROM students s
join xOnesToExport x
on x.id=s.id;
-- 1.1 seconds
위의 1AM 타임 스탬프 파일은 200K 행을 포함하여 결합을 통해 CSV로 내보내졌습니다. 1 초가 걸렸습니다.
LOAD DATA INFILE
및 SELECT INTO OUTFILE
은 원 테이블 이동에 비해 속도가 떨어질 수는없는 한 가지 기능인 보조 기능입니다. 둘째, 사람들은 거의 후자를 사용하는 것처럼 보이지 않습니다.유스 케이스와 트릭을 통해 수행 할 수있는 모든 작업을 살펴 본다면 유연합니다.
Linux의 경우 LINES TERMINATED BY '\n'
을 사용하십시오. 위의 코드 블록이있는 Windows 컴퓨터를 사용하고 있습니다. 유일한 차이점은 파일 경로 및 줄 종결자가되는 경향이 있습니다.
[key_buffers] (http://stackoverflow.com/questions/3663515/mysql-what-is-the-key-buffer)로 돌아 다니면서 읽을 수있는 동안 InnoDB에서 MyISAM으로 전환 한 다음 다시 전환 할 수 있습니다. 확실하게 다른 방법이 있습니다. 특히 mysql 설정을 사용하는 것이 좋습니다. – Andrew
700K 행은 중간 크기입니다. * 현대 시스템에서 매우 큰 *은 100M 행 이상입니다. –
죄송합니다 @OllieJones, 나는 그것에 대해 몰랐습니다 –