オンラインストアの在庫管理統計を計算するサービスの開発中に、異なるMySQLサーバー間でテーブルのインポート/エクスポートをすばやく整理するタスクが発生しました。 単純かつ透過的にそれを行う必要があったため、最適化が先に行われるため、MySQL 5.0ドキュメントから著者の推奨事項を使用することにしました。
データ交換フォーマットとして、CSVは実装が容易なため、正確に採用することにしました。
その結果、2つの機能が判明しました
テーブルをエクスポートする ( MySQL構文の説明 )
function export_csv( $table, // $afields, // - $filename, // CSV // ( web-) $delim=',', // CSV $enclosed='"', // $escaped='\\', // $lineend='\\r\\n'){ // CSV $q_export = "SELECT ".implode(',', $afields). " INTO OUTFILE '".$_SERVER['DOCUMENT_ROOT'].$filename."' ". "FIELDS TERMINATED BY '".$delim."' ENCLOSED BY '".$enclosed."' ". " ESCAPED BY '".$escaped."' ". "LINES TERMINATED BY '".$lineend."' ". "FROM ".$table ; // , if(file_exists($_SERVER['DOCUMENT_ROOT'].$filename)) unlink($_SERVER['DOCUMENT_ROOT'].$filename); return mysql_query($q_export); }
コメント
- このファイルは、MySQLと同じホスト上に作成できます。 ネットワークドライブを共有する機能がOSに設定されている場合、別のサーバーに書き込むことができます。
- テーブルのフィールドがNULLの場合、CSVファイルに\ Nが表示されます。
- サーバー上のローカルディスクにファイルを書き込むには、データベースレベルではなく、MySQLサーバーレベルでグローバルにFILE権限が必要です。 PHPMyAdmin経由またはリクエストによりインストール可能
GRANT FILE ON * . * TO 'username'@'localhost' WITH MAX_QUERIES_PER_HOUR 0 MAX_CONNECTIONS_PER_HOUR 0 MAX_UPDATES_PER_HOUR 0 MAX_USER_CONNECTIONS 0 ;
- ファイルをディレクトリに書き込むには、ディレクトリにmysqlユーザーの書き込み権限があるか、属性757または777が有効になっている必要があります( 他のユーザーの書き込みは許可されています )
テーブルのインポート ( MySQL構文の説明 )
function import_csv( $table, // $afields, // - $filename, // CSV , // ( web-) $delim=',', // CSV $enclosed='"', // $escaped='\\', // $lineend='\\r\\n', // CSV $hasheader=FALSE){ // CSV if($hasheader) $ignore = "IGNORE 1 LINES "; else $ignore = ""; $q_import = "LOAD DATA INFILE '". $_SERVER['DOCUMENT_ROOT'].$filename."' INTO TABLE ".$table." ". "FIELDS TERMINATED BY '".$delim."' ENCLOSED BY '".$enclosed."' ". " ESCAPED BY '".$escaped."' ". "LINES TERMINATED BY '".$lineend."' ". $ignore. "(".implode(',', $afields).")" ; return mysql_query($q_import); }
最後に何がありますか?
- 単一のMySQLクエリによって実行されるため、短くて非常に高速な関数。
- かなり柔軟な実装-フィールドのリストを含む多くのパラメーターを簡単に管理できます
- エクスポートの場合 :フィールド配列のフィールドのリストを変更することにより
$afields
$atable
(select field1, field1 from table2) t
- インポートするには :カスタム変数を使用して不要なフィールドをスキップします-たとえば、
array("column1", "@dummy", "column2", "@dummy", "column3")
- エクスポートの場合 :フィールド配列のフィールドのリストを変更することにより
したがって、開発の単純さと速度の問題は解決されます。 そして、速度と効率の問題が現れると、最適化を行うことも可能になります。
PS。 実際、これらのMySQLコマンドには設定が追加されたより豊富な構文があるため、このコードを改善する分野は必要性と想像力によってのみ制限されます。