在大表中使用node.js中的mysql模块

我在我的MySQL数据库(大约一千万行)有一个大的表,我需要把所有这些数据转换成JSON格式。 对于较小的表,我会使用基本的connection.query("SELECT * FROM TABLE, function(err, results) {}); syntax。但是,我不想将整个表加载到内存中。

我注意到,mysql模块有能力“stream”行( https://github.com/felixge/node-mysql/#streaming-query-rows ),所以我想知道是否仍然将整个表加载到内存和那么只是给我们一行一行,或者它实际上每次只加载一行,所以整个表不会一次存储在内存中。

通过块加载您的数据。 这里有一些工作示例。

 var mysql = require('mysql'); var settings = {}; settings.host = "localhost"; settings.user = "root"; settings.password = "root"; settings.database = "dbname"; var pool = mysql.createPool(settings); var countQuery = "SELECT count(*) as total FROM tbl"; var chunkSize = 1000; pool.getConnection(function(err, connection) { if (err) { connection.release(); console.log("Error on getConnection:", err); return; } connection.query(countQuery, {}, function(err, result) { if (err) { connection.release(); console.log("Error on getConnection:", err); return; } if (result && result[0]) { var totalRows = result[0]['total']; console.log("Total rows in db:", totalRows); var periods = Math.ceil(totalRows/chunkSize) console.log("Total periods", periods); var selectQuery = "SELECT * FROM tbl ORDER BY id DESC LIMIT "; for(var i = 0; i < periods; i++) { var offset = i*chunkSize; var runQuery = selectQuery + offset + "," + chunkSize; console.log(runQuery); connection.query(runQuery, {}, function (err, results) { if (err) { console.log("Error on runQuery:", err); return; } console.log("Data:", results); }); } connection.release(); } }); }); 

我脑海中首先想到的是dynamic分页。 我相信你熟悉的偏移量和限制与MySQL,与此,你可以控制你的查询。

  1. 首先查询,获得1000行。
  2. 如果成功,再次添加查询1000行。
  3. 做recursion的。