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、回调执行的顺序。一开始还以为会按照发出申请的顺序回调,结果完全不是这样。每次回调的顺序居然都不一样。看来想要准确控制回调的话,不能这么放羊的。

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

  1. 使用 NodeJS+Express+MySQL 实现简单的增删改查

    关于node.js暂时记录如下,以后有时间一定学习 文章来自简书,作者:sprint,2016-07 使用 Node.js + Express+MySQL 实现简单的增删改查 https://www. ...

  2. Vc数据库编程基础MySql数据库的表增删改查数据

    Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...

  3. python操作三大主流数据库(2)python操作mysql②python对mysql进行简单的增删改查

    python操作mysql②python对mysql进行简单的增删改查 1.设计mysql的数据库和表 id:新闻的唯一标示 title:新闻的标题 content:新闻的内容 created_at: ...

  4. mysql 的基本操作总结--增删改查

    本文只是总结一下mysql 的基本操作,增删改查,以便忘记的时候可以查询一下 1.创建数据库 语法:CREATE DATABASES 数据库名; 例子: CREATE DATABASES studen ...

  5. Mysql数据表的增删改查

    ---恢复内容开始--- Mysql数据表的增删改查 1.创建表   语法:CREATE TABLE 表名(字段1,字段2,字段3.......) CREATE TABLE `users` ( `us ...

  6. Python进阶----数据库的基础,关系型数据库与非关系型数据库(No SQL:not only sql),mysql数据库语言基础(增删改查,权限设定)

    day37 一丶Python进阶----数据库的基础,mysql数据库语言基础(增删改查,权限设定) 什么是数据库:    简称:DataBase ---->DB    数据库即存放数据的仓库, ...

  7. MySQL数据库安装,MySQL数据库库的增删改查,表的增删改查,表数据的基本数据类型

    一 MySQL的安装 MySQL现在属于甲骨文公司,所以和java语言匹配度较高,同时甲骨文公司的另一种数据库为Oracle,两者同为关系型数据库,即采用关系模型来组织数据,以行和列的方法来存储数据的 ...

  8. Node.js + MySQL 实现数据的增删改查

    通过完成一个 todo 应用展示 Node.js + MySQL 增删改查的功能.这里后台使用 Koa 及其相应的一些中间件作为 server 提供服务. 初始化项目 $ mkdir node-cru ...

  9. 基于nodejs+express+mysql+webstorm+html的 增删改查

    一.工具准备 Nodejs框架,WebStorm.Mysql服务.Navicat.此篇文章只讲项目的搭建过程,至于Nodejs,WebStorm.Mysql的下载.安装与配置网上资源很多,请自行查阅, ...

  10. 利用Express+MySQL进行简单的增删改查

    前言: 随着JavaScript语言的快速发展,其功能越来越强大,能做的事情也越来越多. 目前,web前端工程师能够利用NodeJS搭建服务,也成为了越来越多互联网公司对前端开发的硬性要求. 本文主要 ...

随机推荐

  1. Android 开发者必知必会的权限管理知识

    本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/OQRHEufCUXBA3d3DMZXMKQ 导语 本 ...

  2. emscripten、 WebAssembly,传递字符串给c函数

    下面看具体的实例. 下面的代码是一个C函数,实现简单的字符串拼接,然后返回拼接的字符串. #include <stdio.h> #include <string>  char* ...

  3. Linux 桌面玩家指南:12. 优秀的文本化编辑思想大碰撞(Markdown、LaTeX、MathJax)

    特别说明:要在我的随笔后写评论的小伙伴们请注意了,我的博客开启了 MathJax 数学公式支持,MathJax 使用$标记数学公式的开始和结束.如果某条评论中出现了两个$,MathJax 会将两个$之 ...

  4. 【Python实践-3】汉诺塔问题递归求解(打印移动步骤及计算移动步数)

    # -*- coding: utf-8 -*- #汉诺塔移动问题 # 定义move(n,a,b,c)函数,接受参数n,表示3个柱子A.B.C中第1个柱子A的盘子数量 # 然后打印出把所有盘子从A借助B ...

  5. 知乎专栏开放性api

    概述 这是我在工作中扒的知乎专栏的开放性api,记录下来供以后开发时参考,相信对其他人也有用. 参考资料: zhihu库 zhihu-oauth库 开放性api 其中hemingke是专栏名字,可以换 ...

  6. 精读《V8 引擎 Lazy Parsing》

    1. 引言 本周精读的文章是 V8 引擎 Lazy Parsing,看看 V8 引擎为了优化性能,做了怎样的尝试吧! 这篇文章介绍的优化技术叫 preparser,是通过跳过不必要函数编译的方式优化性 ...

  7. 如何大幅提升web前端性能之看tengine在大公司架构实践

    在一个项目还是单体架构的时候,所有的js,css,image都会在一个web网站上,看起来并没有什么问题,比如下面这样: 但是当web网站流量起来的时候,这个单体架构必须要进行横向扩展,而在原来的架构 ...

  8. There was a problem with the instance info replicator

    There was a problem with the instance info replicator 错误原因: 该服务尝试将自己作为客服端注册 解决办法: 在application.yml配置 ...

  9. java爬虫系列第二讲-爬取最新动作电影《海王》迅雷下载地址

    1. 目标 使用webmagic爬取动作电影列表信息 爬取电影<海王>详细信息[电影名称.电影迅雷下载地址列表] 2. 爬取最新动作片列表 获取电影列表页面数据来源地址 访问http:// ...

  10. Struts2笔记_拦截器

    A.拦截器是什么 --- Interceptor:拦截器,起到拦截Action的作用. ---Filter:过滤器,过滤从客户端向服务器发送的请求. ---Interceptor:拦截器,拦截是客户端 ...