node+mysql,实现基本的增删改查,附带跟踪记录和运行时间记录

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: node+mysql,实现基本的增删改查,附带跟踪记录和运行时间记录Node + mysql 实现基础的增删改查,以及性能测试。网上有很多这样的例子,我也是找来学习的。感觉node对mysql的操作非常简单,也很实用,比如自带防止sql注入的功能,一开始还担心注入漏洞呢,后来发现完全没必要。

node+mysql,实现基本的增删改查,附带跟踪记录和运行时间记录
Node + mysql 实现基础的增删改查,以及性能测试。

网上有很多这样的例子,我也是找来学习的。

感觉node对mysql的操作非常简单,也很实用,比如自带防止sql注入的功能,一开始还担心注入漏洞呢,后来发现完全没必要。

返回的记录集直接就是json格式,都不用转换,直接就可以用。也不用事先定义实体类。非常方便。

基本步骤:

1、 创建mysql对象

2、 设置连接字符串

3、 createConnection

4、 写sql语句和参数值

5、 先connection.connect(),然后再connection.query()就搞定了。

6、 connection.end()

7、 最后等待返回结果

基础代码就不贴了,百度一下有很多,后面有修改后的代码。

不用区分增删改查,反正都是这个套路,只要改改sql语句和参数就可以了。比ado.net简单和方便多了。

然后就是对性能的了解,每个步骤都花了多长时间?有没有坑,会不会出现浪费性能的写法?

首先在node里面使用require()加载的对象,都会进入缓存,下次再使用速度就快了,因为会从缓存里直接提取。

然后要看看其他几个写法的性能,最后看看数据库操作的速度。

上一篇写了一个精确取时间的,就是为了这里的测试性能,也就是每个语句的执行时间。

为了更好的记录运行过程和时间,定义一个简单的类来记录

复制代码
var msg={

title:'增删改查的演示',
startTime:t1,
endTime:0,
items:[]

};
复制代码

每个步骤都可以push到items里面。这样程序执行步骤和时间就可以准确的记录下来了。

完整代码如下:

复制代码
/**

  • Created by jyk00 on 2019/3/29.
  • mysql的测试
    */

var time = require('../preciseTime').time;

var num= 4;

//开始运行时间
var t1 = time();

//跟踪记录
var msg={

title:'增删改查的演示',
startTime:t1,
endTime:0,
items:[]

};

var t2 = time();
var mysql = require('mysql');
var t3 = time();

msg.items.push({

title:'创建mysql对象用时:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]

});

t2 = time();
var mysql2 = require('mysql');
t3 = time();

msg.items.push({

title:'再次创建mysql对象用时:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]

});

t2 = time();
var cnString = require('../sqlConnection.json');
t3 = time();

msg.items.push({

title:'获取cnString用时:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]

});

var connection ;

//==================== 添加数据
setConnect('第一次');

t2 = time();
var userAddSql = 'INSERT INTO node_user(id,name,age) VALUES(0,?,?)';
var userAddSql_Params = ["张洒 ' -- " , 55];

//增 add
connection.query(userAddSql,userAddSql_Params,function (err, result) {

if(err){
    console.log('[INSERT ERROR ] 注入 - ',err.message);
    return;
}
logCallback('添加数据完成用时',tadd1);

});

connection.end();

t3 = time();
var tadd1 = time(); //记录开始开始添加数据时间

msg.items.push({

title:'调用添加用时:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]

});

//======================= 修改数据
setConnect('第二次');

t2 = time();
var userModSql = 'UPDATE node_user SET name = ?,age = ? WHERE id = ?';
var userModSql_Params = ['Hello World',99,7];
//改 up
connection.query(userModSql,userModSql_Params,function (err, result) {

if(err){
    console.log('[UPDATE ERROR] - ',err.message);
    return;
}
logCallback('修改数据用时',tupdate1,result);

});

connection.end();

t3 = time();
var tupdate1 = time(); //记录开始开始添加数据时间

msg.items.push({

title:'调用修改用时:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]

});

//========================= 查询数据
setConnect('第三次');

t2 = time();
var userGetSql = 'SELECT * FROM node_user where id <5';
//查 query
connection.query(userGetSql,function (err, result) {

if(err){
    console.log('[SELECT ERROR] - ',err.message);
    return;
}
logCallback('查询数据用时',tselect1,result);

});

connection.end();

var tselect1 = time();//记录开始查询时间

t3 = time();

msg.items.push({

title:'调用查询用时:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]

});

//====================== 删除数据
setConnect('第四次');

t2 = time();
var userDelSql = 'DELETE FROM node_user WHERE id = 7';
connection.query(userDelSql,function (err, result) {

if(err){
    console.log('[DELETE ERROR] - ',err.message);
    return;
}
logCallback('删除数据用时',tdel1,result);

});

connection.end();

var tdel1 = time();

msg.items.push({

title:'调用删除用时:' + (t3-t2),
startTime:t2,
endTime:t3,
items:[]

});

//外部调用执行完毕用时
t3 = time();
msg.items.push({

title:'外部调用执行完毕用时:' + (t3-t1),
startTime:t1,
endTime:t3,
items:[]

});

//设置信息,开始连接
function setConnect(title){

t2 = time();
connection = mysql.createConnection(cnString);
t3 =  time();

msg.items.push({
    title:title + '创建connection对象用时:' + (t3-t2),
    startTime:t2,
    endTime:t3,
    items:[]
});

t2 = time();
connection.connect();
t3 =  time();

msg.items.push({
    title:title + 'connect用时:' + (t3-t2),
    startTime:t2,
    endTime:t3,
    items:[]
});

}

//记录回调
function logCallback(title,tstart,result){

var tend = time();
msg.items.push({
    title:title  + (tend-tstart) + '_' ,
    startTime:tstart,
    endTime:tend,
    items:[]
});
num--;
if (num == 0){
    msg.items.push({
        title:'最后回调' + (tend - t1),
        startTime:t1,
        endTime:tend,
        items:[]
    });
    console.log(JSON.stringify(msg));
}

}
复制代码

运行后跟踪记录如下:json格式,便于查看。

复制代码
{

"title": "增删改查的演示",
"startTime": 2542410048.328554,
"endTime": 0,
"items": [
    {
        "title": "创建mysql对象用时:2.3957343101501465",
        "startTime": 2542410048.366954,
        "endTime": 2542410050.762688,
        "items": []
    },
    {
        "title": "获取cnString用时:0.6924800872802734",
        "startTime": 2542410050.788715,
        "endTime": 2542410051.481195,
        "items": []
    },
    {
        "title": "第一次创建connection对象用时:112.34650135040283",
        "startTime": 2542410051.662955,
        "endTime": 2542410164.009456,
        "items": []
    },
    {
        "title": "第一次connect用时:3.8489623069763184",
        "startTime": 2542410164.022256,
        "endTime": 2542410167.871218,
        "items": []
    },
    {
        "title": "调用添加用时:1.268907070159912",
        "startTime": 2542410167.893405,
        "endTime": 2542410169.162312,
        "items": []
    },
    {
        "title": "第二次创建connection对象用时:0.16170692443847656",
        "startTime": 2542410169.179378,
        "endTime": 2542410169.341085,
        "items": []
    },
    {
        "title": "第二次connect用时:0.7057070732116699",
        "startTime": 2542410169.347059,
        "endTime": 2542410170.052766,
        "items": []
    },
    {
        "title": "调用修改用时:0.18773317337036133",
        "startTime": 2542410170.069406,
        "endTime": 2542410170.257139,
        "items": []
    },
    {
        "title": "第三次创建connection对象用时 :0.0669870376586914",
        "startTime": 2542410170.268659,
        "endTime": 2542410170.335646,
        "items": []
    },
    {
        "title": "第三次connect用时 :0.12415933609008789",
        "startTime": 2542410170.338206,
        "endTime": 2542410170.462365,
        "items": []
    },
    {
        "title": "调用查询用时:0.059305667877197266",
        "startTime": 2542410170.467059,
        "endTime": 2542410170.526365,
        "items": []
    },
    {
        "title": "第四次创建connection 对象用时:1.0282669067382812",
        "startTime": 2542410170.534046,
        "endTime": 2542410171.562313,
        "items": []
    },
    {
        "title": "第四次connect用时:0.11946725845336914",
        "startTime": 2542410171.579806,
        "endTime": 2542410171.699273,
        "items": []
    },
    {
        "title": "调用删除用时:-0.0038399696350097656",
        "startTime": 2542410171.703113,
        "endTime": 2542410171.699273,
        "items": []
    },
    {
        "title": "外部调用执行完毕用时:123.41466474533081",
        "startTime": 2542410048.328554,
        "endTime": 2542410171.743219,
        "items": []
    },
    {
        "title": "修改数据用时16.291846752166748_",
        "startTime": 2542410170.258419,
        "endTime": 2542410186.550266,
        "items": []
    },
    {
        "title": "查询数据用时20.791049003601074_",
        "startTime": 2542410170.525512,
        "endTime": 2542410191.316561,
        "items": []
    },
    {
        "title": "添加数据完成用时23.376222610473633_",
        "startTime": 2542410169.165725,
        "endTime": 2542410192.541948,
        "items": []
    },
    {
        "title": "删除数据用时21.536436080932617_",
        "startTime": 2542410171.734686,
        "endTime": 2542410193.271122,
        "items": []
    },
    {
        "title": "最后回调144.94256782531738",
        "startTime": 2542410048.328554,
        "endTime": 2542410193.271122,
        "items": []
    }
]

}
复制代码

分析一下记录可以发现:

1、第一次 require('mysql') 有点慢,再次调用就快了很多,可以证明确实是使用了缓存。

2、重点是 mysql.createConnection(cnString),第一次执行居然需要100多号码,不知道他都做了什么,不过好在再次执行的时间就快了很多,只需要0.5毫秒左右,似乎也是用了缓存。既然以后就快了,那么就不用担心写多了导致效率下降的问题了。

3、数据操作的执行时间,大概是20-50毫秒这个级别的,感觉不是太快,和 c# + mssql的操作似乎差不多。

4、回调执行的顺序。一开始还以为会按照发出申请的顺序回调,结果完全不是这样。每次回调的顺序居然都不一样。看来想要准确控制回调的话,不能这么放羊的。
原文地址https://www.cnblogs.com/jyk/p/10654353.html

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
2月前
|
JavaScript 关系型数据库 MySQL
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
创建nodejs项目并接入mysql,完成用户相关的增删改查的详细操作
45 0
|
23天前
|
JavaScript 关系型数据库 MySQL
node连接mysql,并实现增删改查功能
【8月更文挑战第26天】node连接mysql,并实现增删改查功能
39 3
|
1月前
|
关系型数据库 MySQL 大数据
C#使用SqlSugar操作MySQL数据库实现简单的增删改查
C#使用SqlSugar操作MySQL数据库实现简单的增删改查
142 2
|
21天前
|
关系型数据库 MySQL 数据库
MySQL数据库的增删改查
MySQL数据库的增删改查
12 0
|
28天前
|
SQL 关系型数据库 MySQL
"Python与MySQL的浪漫邂逅:一键掌握增删改查,开启你的数据库编程之旅!"
【8月更文挑战第21天】Python因其简洁的语法和强大的库支持,成为连接数据库的首选工具。本文介绍如何使用Python连接MySQL数据库并执行基本操作。首先需安装`mysql-connector-python`库。通过配置连接信息建立数据库连接后,可利用`cursor.execute()`执行SQL语句进行数据的增删改查,并通过`commit()`提交更改。查询时使用`fetchall()`或`fetchone()`获取结果。记得处理异常及关闭连接以释放资源。掌握这些基础,有助于高效进行数据库编程。
27 0
|
1月前
|
前端开发 Java 关系型数据库
通过HTML网页对mysql数据库进行增删改查(CRUD实例)
通过HTML网页对mysql数据库进行增删改查(CRUD实例)
140 0
|
2月前
|
消息中间件 关系型数据库 MySQL
实时计算 Flink版操作报错合集之运行mysql to doris pipeline时报错,该如何排查
在使用实时计算Flink版过程中,可能会遇到各种错误,了解这些错误的原因及解决方法对于高效排错至关重要。针对具体问题,查看Flink的日志是关键,它们通常会提供更详细的错误信息和堆栈跟踪,有助于定位问题。此外,Flink社区文档和官方论坛也是寻求帮助的好去处。以下是一些常见的操作报错及其可能的原因与解决策略。
|
1月前
|
SQL 关系型数据库 MySQL
MySQL运行在docker容器中会损失多少性能
MySQL运行在docker容器中会损失多少性能
|
2月前
|
存储 SQL Cloud Native
云原生数据仓库使用问题之运行MySQL命令发现中文内容变成了问号,该如何解决
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
3月前
|
SQL Java 数据库连接
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
2万字实操案例之在Springboot框架下基于注解用Mybatis开发实现基础操作MySQL之预编译SQL主键返回增删改查
56 2