nodejs sequelize模块插入数据慢是肿么回事啊?
发布于 5 年前 作者 caiya 3691 次浏览 来自 问答

最近使用sequelize模块操作mysql,具体sequelize配置如下:

const Sequelize = require('sequelize');
const sequelize = new Sequelize('users', 'root', 'root', {
    host: '192.168.20.131',
    dialect: 'mysql',
    pool: {
        max: 5,
        min: 0,
        idle: 10000
    }
});
//测试数据库链接
sequelize.authenticate().then(function() {
    console.log("数据库连接成功");
}).catch(function(e) {
    //数据库连接失败时打印输出
    console.log(e);
});

exports.sequelize = sequelize;

新增的api也很简单:

router.post('/', function(req, res, next) {
    var user = User.build(req.body);
    user.save().then(function(result) {
        res.json({
            status: 1,
            data: result
        });
    }).catch(function(err) {
        throw err;
    });
});

可以看到如下图,插入一条数据达到了离奇的150+ms,不知道哪里出错了,求解啊啊啊啊。。。。 untitled1.png

13 回复

难道是我数据库的问题?????

你是怎么判断时间耗在了数据库的插入上的 这个时间不是你在postman上用的总耗时吗?

@hezhongfeng 说的很有道理… lz可以在save之前来个时间戳, then里面计算下就知道耗时了

也许是数据库的连接上慢呢?没表现出是插入的问题吧

@hezhongfeng 时间还是有点长 untitled1.png

untitled2.png

@caiya User.build(req.body) 有点不靠谱,你把你需要的东西提取出来保存试试啊!

@danielsss 改成这样子了,不过还是有点慢,估计就是我机子配置不行吧 untitled1.png

untitled2.png

@caiya 数据库是本地还是远程连接 ?

@danielsss 上面测试都是本地的库 untitled1.png

还有个问题想求解下,使用sequelize实现关联映射时,调用sync()会自动生成对应的数据库表,如果在sequelize中配置了关联关系,则会自动生成一个表外键,如果不想生成物理外键约束,仅仅生成一个逻辑外键怎么配置呢?

找到了,在每个model配置的时候有一个references类型,可以直接配置不带约束的外键引用:

// 在调用Trainer.hasMany(series)方法的,Series 有一个 trainer_id=Trainer.id 的外键引用
Series = sequelize.define('series', {
  title:        DataTypes.STRING,
  sub_title:    DataTypes.STRING,
  description:  DataTypes.TEXT,
 
  // Set FK relationship (hasMany) with `Trainer`
  trainer_id: {
    type: DataTypes.INTEGER,
    references: {
      model: "trainers",
      key: "id"
    }
  }
})

上面不带约束的这种写法实际数据库还是生成了外键约束,这个怎么求解呢

回到顶部