【问题标题】:Bulk deletion of mysql rows using node.js使用 node.js 批量删除 mysql 行
【发布时间】:2014-06-06 13:02:08
【问题描述】:
var Sequelize= require('sequelize')
var sequelize = new Sequelize('db', 'user', 'password',
{pool: { maxConnections: 5, maxIdleTime: 30 }})
var table = sequelize.define('User', 
{ 
       trip_paramid: Sequelize.INTEGER
},

{timestamps:false})

table.sync({ force: false }).success(function()
{
  table.destroy('`id` >= 5685321').success(function() {
  console.log("deleted");
  })
  table.destroy('`id` >= 9600000').success(function() {
  console.log("deleted");
  })
  table.destroy('`id` >= 15600000').success(function() {
  console.log("deleted");
  })
  table.destroy('`id` >= 20000000').success(function() {
  console.log("deleted");
  })
  table.destroy('`id` >= 25000000').success(function() {
  console.log("deleted");
  })
  table.destroy('`id` >= 35600000').success(function() {
  console.log("deleted");
  })
})

我在这里使用 sequelize 作为 ORM 来根据条件批量删除行。这是工作。但现在我正在尝试在不使用 sequelize 的情况下执行相同的功能。问题是因为我需要从现有数据库中删除行。在这种情况下,使用 sequelize 成为一个问题。我尝试过不使用 sequelize 的批量删除它也可以工作,但整个过程变得缓慢。

var mysql = require('mysql');              
var pool  = mysql.createPool({
connectionLimit : 10,
host            : 'host',
user            : 'user',
password        : 'password',
database        : 'db',
multipleStatements: true
 });


var id=57166;
var query='delete from users1 where id=';
bulkdelete();

function bulkdelete()
{
if(trip_paramid >=57166)
  {
   pool.query(query+ id+';'+query+(id+1)+';'+query+(id+1)+';'+query+(id+1)+';'+query+(id+1)+';', function(err, results) 
   {
    if (err) throw err;
    trip_paramid++;
        bulkdelete();
        console.log("deleted1");
    });
}
}

任何人都可以提出解决此问题的想法。我需要加快进程(在不使用任何 ORM 的情况下在更短的时间内多行)

【问题讨论】:

    标签: mysql node.js sequelize.js


    【解决方案1】:

    我可以看到您的代码存在几个问题。

    首先,以您的方式将字符串连接到查询中是非常危险的(容易让其他人破解您的东西),而且它本身也很慢并且会占用内存。每次执行 + 操作时,您都会分配一个新字符串。

    第二,数据库擅长集合运算,做起来很快;如果您要获得大于 57166 的所有内容,为什么要逐个进行,只需像这样构建查询。

    delete from users where id >= 57166;.

    如果需要作为实际参数,请使用 mysql2 驱动程序中描述的准备好的语句:https://github.com/sidorares/node-mysql2

    您的查询将类似于:

    delete from users where id >=?;

    然后您将最小 ID 号作为参数传递。

    【讨论】:

    • 我已经尝试过使用准备好的语句,但它也没有提高速度。
    • 程序中给出的id是我表的最小id
    • 准备好的语句不是为了速度,它们是为了防止人们通过 sql 注入攻击您的查询。对查询的更改应该会有所帮助,而不是像您那样为数据库中的每条记录编写不同的查询。
    • 如果您想转储所有记录,您也可以尝试使用truncate table
    猜你喜欢
    • 2016-10-24
    • 2014-04-05
    • 2012-06-04
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-19
    • 1970-01-01
    相关资源
    最近更新 更多