Nodejs下mysql性能测试

Nodejs下mysql性能测试

<p>近期对node下的几个mysql操作库做了一下简单的调研<br /> 主要是针对这3个module进行<br /> libmysqlclient,mysql-native, mysql</p><br/><h2>node-libmysqlclient</h2><br/><p><a href=“https://github.com/Sannis/node-mysql-libmysqlclient”>https://github.com/Sannis/node-mysql-libmysqlclient</a><br /> 基于libmysql的封装, 支持阻塞与非阻塞两种操作方式,目前在query部分功能比较完善,prepare statement方面还是有些bug,实际测试中一直出core</p><br/><h4>安装</h4><br/><p>npm install mysql-libmysqlclient</p><br/><h2>node-mysql</h2><br/><p><a href=“https://github.com/felixge/node-mysql”>https://github.com/felixge/node-mysql</a><br /> 纯node的实现, 支持prepare statement, 数据的获取支持事件与callback两种方式</p><br/><h4>安装</h4><br/><p>npm install mysql</p><br/><h2>node-mysql-native</h2><br/><p><a href=“https://github.com/sidorares/nodejs-mysql-native”>https://github.com/sidorares/nodejs-mysql-native</a></p><br/><p>纯node的实现, 内置有简单的连接池支持,支持prepare statement, 数据的获取只支持通过事件方式</p><br/><h4>安装</h4><br/><p>npm install mysql-native</p><br/><h2>测试设计</h2><br/><h4>测试表结构</h4><br/><pre lang=“mysql”>CREATE TABLE test10 (<br/> id int(10) unsigned NOT NULL DEFAULT ‘0’,<br/> txt varchar(500) DEFAULT ‘’<br/>) ENGINE=InnoDB DEFAULT CHARSET=utf8;<br/></pre><br/><h4>测试数据</h4><br/><p>分别生成了含10, 100, 500, 1500行记录的4张表<br /> 使用10个并发连接分别对其进行SELECT * FROM table的查询</p><br/><h2>测试结论</h2><br/><p><img title=“NewImage.jpg” src=“http://static.data.taobaocdn.com/up/nodeclub/2011/02/NewImage.jpg” border=“0” alt=“NewImage.jpg” width=“544” height=“125” /></p><br/><p>其中数值表示qps值</p><br/><p>在结果集较小时node-mysql-native明显胜出<br /> 当结果集增大到接近100行时,node-libmysqlclient开始表现出更佳的性能<br /> node-mysql性能与其他两个module差距比较大,如果对性能有一定要求的话,则其基本不可用</p><br/><h2>测试代码</h2><br/><p><a href=“http://code.google.com/p/cnodejs/source/browse/#svn%2Ftrunk%2Fmysql-benchmark”>http://code.google.com/p/cnodejs/source/browse/#svn%2Ftrunk%2Fmysql-benchmark</a></p>


16 回复

Nodejs下mysql性能测试

近期对Node.js下的几个MySQL操作库进行了一些简单的性能测试,主要集中在以下几个模块:

  • libmysqlclient
  • mysql-native
  • mysql

node-libmysqlclient

node-mysql-libmysqlclient

  • 基于libmysql的封装,支持阻塞与非阻塞两种操作方式。目前在query部分功能比较完善,但在prepare statement方面存在一些bug,实际测试中一直出现core问题。

安装:

npm install mysql-libmysqlclient

node-mysql

node-mysql

  • 完全基于Node.js实现,支持prepare statement,数据的获取支持事件与callback两种方式。

安装:

npm install mysql

node-mysql-native

nodejs-mysql-native

  • 完全基于Node.js实现,内置有简单的连接池支持,支持prepare statement,数据的获取只支持通过事件方式。

安装:

npm install mysql-native

测试设计

测试表结构:

CREATE TABLE test10 (
    id int(10) unsigned NOT NULL DEFAULT '0',
    txt varchar(500) DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

测试数据:

  • 分别生成了含10, 100, 500, 1500行记录的4张表。
  • 使用10个并发连接分别对其进行SELECT * FROM table的查询。

测试结论

  • 其中数值表示QPS(每秒查询次数)值。
  • 在结果集较小时,node-mysql-native表现最好。
  • 当结果集增大到接近100行时,node-libmysqlclient开始表现出更佳的性能。
  • node-mysql的性能与其他两个模块相比差距较大,如果对性能有一定要求的话,可能不太适合使用。

测试代码

测试代码地址

示例代码

以下是一个简单的示例代码,用于测试node-mysql库的性能:

const mysql = require('mysql');
const pool = mysql.createPool({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'testdb'
});

function queryDatabase(pool, callback) {
  pool.query('SELECT * FROM test10', (err, results) => {
    if (err) throw err;
    console.log(`Received ${results.length} rows`);
    callback();
  });
}

// 创建10个并发连接并执行查询
let queries = [];
for (let i = 0; i < 10; i++) {
  queries.push(new Promise((resolve) => {
    queryDatabase(pool, resolve);
  }));
}

Promise.all(queries).then(() => {
  console.log('All queries completed');
});

这段代码创建了一个数据库连接池,并通过10个并发连接执行相同的查询。您可以根据需要调整参数以更好地模拟您的应用场景。


表格里的值含义是什么?

同问楼上的问题,还有表格中,num指的是?

num我知道,是表中的数据行数

我看错了,大家忽略我吧…

选择node-mysql-native了! <br/>另外,发现有很多memcached的nodejs的实现,能否给个建议,选哪一款较好。 <br/>谢谢

我测试了其中两个,貌似都不太靠谱,所以自己写了一个。过两天放出来

膜拜啊。。。

这个东东怎么在CYGWIN里面用

node-mysql 应该要配合node-mysql-pool 和node-mysql-cache 使用, 用上连接池,应该效率显著提升

nodejs有oracle的接口吗?

/*查询数据*/
client.query(sql).addListener('row',function(results){
	console.dir(results);
	/*HTTP返回*/
	response.writeHead(200,{'Content-Tyep':'text/plain'});
	var data = JSON.stringify(results);
	response.write(data + "\n");
	response.end();
}).addListener('end', function() {
	/*连接关闭*/
	client.close();
});

我用mysql-native查询mysql,console.dir(results)方法可以将我需要的查询结果输出在服务端,但是通过response.write(data + “\n”)输出在我访问的页面里的却是第一条数据。

请问用何方法才能在我访问的页面中获得我想要的查询结果呢?求助中

不知道 大家都是用什么工具测试性能的呢??求推荐

过来mark下,刚好用到

针对Node.js下的MySQL性能测试,以下是针对node-mysqlnode-mysql-nativelibmysqlclient三个模块的简单测试及代码示例。

测试环境

  • Node.js版本:v16.15.0
  • MySQL版本:8.0.29
  • 表结构:test10表包含idtxt字段

测试表结构

CREATE TABLE `test10` (
    `id` int(10) unsigned NOT NULL DEFAULT '0',
    `txt` varchar(500) DEFAULT ''
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

安装依赖

首先需要安装对应的模块:

npm install mysql
npm install mysql-native
npm install mysql-libmysqlclient

测试代码示例

这里提供一个简单的测试脚本,用于模拟10个并发连接并执行SELECT * FROM table查询。

node-mysql 示例代码

const mysql = require('mysql');
const pool = mysql.createPool({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'test'
});

const start = Date.now();
let count = 0;

for (let i = 0; i < 10; i++) {
    pool.query('SELECT * FROM test10', function(err, results) {
        if (err) throw err;
        count++;
        if (count === 10) {
            console.log(`Time taken: ${Date.now() - start}ms`);
        }
    });
}

node-mysql-native 示例代码

const mysqlNative = require('mysql-native');
const pool = new mysqlNative.Pool({
    user: 'root',
    password: '',
    port: 3306,
    database: 'test'
});

const start = Date.now();
let count = 0;

for (let i = 0; i < 10; i++) {
    pool.query('SELECT * FROM test10', function(err, results) {
        if (err) throw err;
        count++;
        if (count === 10) {
            console.log(`Time taken: ${Date.now() - start}ms`);
        }
    });
}

node-libmysqlclient 示例代码

const mysqlClient = require('mysql-libmysqlclient');

const client = new mysqlClient.Client({
    host: 'localhost',
    user: 'root',
    password: '',
    database: 'test'
});

const start = Date.now();
let count = 0;

for (let i = 0; i < 10; i++) {
    client.query('SELECT * FROM test10', function(err, results) {
        if (err) throw err;
        count++;
        if (count === 10) {
            console.log(`Time taken: ${Date.now() - start}ms`);
        }
    });
}

测试结论

根据上述测试代码,可以分别对不同模块进行性能对比。通过模拟多个并发连接并执行相同SQL查询,可以得出不同模块在处理大量数据时的表现差异。根据之前的数据,通常在结果集较小的情况下node-mysql-native表现较好;当结果集较大时,libmysqlclient可能更具优势。

回到顶部