Node + mysql 實現基礎的增刪改查,以及性能測試。node
網上有不少這樣的例子,我也是找來學習的。mysql
感受node對mysql的操做很是簡單,也很實用,好比自帶防止sql注入的功能,一開始還擔憂注入漏洞呢,後來發現徹底不必。sql
返回的記錄集直接就是json格式,都不用轉換,直接就能夠用。也不用事先定義實體類。很是方便。數據庫
基本步驟:json
一、 建立mysql對象c#
二、 設置鏈接字符串緩存
三、 createConnection性能
四、 寫sql語句和參數值學習
五、 先connection.connect(),而後再connection.query()就搞定了。測試
六、 connection.end()
七、 最後等待返回結果
基礎代碼就不貼了,百度一下有不少,後面有修改後的代碼。
不用區分增刪改查,反正都是這個套路,只要改改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": [] } ] }
分析一下記錄能夠發現:
一、第一次 require('mysql') 有點慢,再次調用就快了不少,能夠證實確實是使用了緩存。
二、重點是 mysql.createConnection(cnString),第一次執行竟然須要100多號碼,不知道他都作了什麼,不過好在再次執行的時間就快了不少,只須要0.5毫秒左右,彷佛也是用了緩存。既然之後就快了,那麼就不用擔憂寫多了致使效率降低的問題了。
三、數據操做的執行時間,大概是20-50毫秒這個級別的,感受不是太快,和 c# + mssql的操做彷佛差很少。
四、回調執行的順序。一開始還覺得會按照發出申請的順序回調,結果徹底不是這樣。每次回調的順序竟然都不同。看來想要準確控制回調的話,不能這麼放羊的。