できるだけ多くの人ができることは、できるだけ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
200K行と上記1AMのタイムスタンプファイルが参加を経由してCSVとしてエクスポートされました。それは1秒かかりました。
LOAD DATA INFILE
およびSELECT INTO OUTFILE
は、1つのことについては、生のテーブル移動が不十分な速度では打ち勝つことができないコンパニオン機能です。第二に、人々はめったに後者を使用していないようです。ユースケースやテクニックを使ってできることをすべて見ても、柔軟性があります。
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、私はそれについて知らなかった –