Nodejs下今天做的关于 mysql 和 mysql-libmysqlclient 的性能测试

Nodejs下今天做的关于 mysql 和 mysql-libmysqlclient 的性能测试

最近正在做 mysql 的代理服务,苦于 node 下还没有成熟的 module,只能在几个主流的 module 中寻找了。经过大牛们的推荐和多次的压测,mysql-libmysqlclient 应该算是目前性能较好的 module 了,但是对于大数据集(2000 行以后基本上结果就很难看了)的读取还是不太乐观,所以建议不要去用来获取大数据集了,能做分页就分页,以下是压测结果。

  • mysql 2.0.0-alpha9

读取 1000 次,每次读取 2000 条记录

1.
耗时 10626 ms
每秒 94
2.
耗时 10447 ms
每秒 95
3.
耗时 10602 ms
每秒 94

写入 10000 条记录,每次写入 1 条

1.
耗时 3444 ms
每秒 2903
2.
耗时 3417 ms
每秒 2926
3.
耗时 3384 ms
每秒 2955
  • mysql-libmysqlclient 1.5.2

读取 1000 次,每次读取 2000 条记录

1.
耗时 4698 ms
每秒 212
2.
耗时 4847 ms
每秒 206
3.
耗时 4802 ms
每秒 208

写入 10000 条记录,每次写入 1 条

1.
耗时 2718 ms
每秒 3679
2.
耗时 2708 ms
每秒 3692
3.
耗时 2666 ms
每秒 3750

2 回复

Nodejs下今天做的关于 mysql 和 mysql-libmysqlclient 的性能测试

最近正在做 MySQL 的代理服务,苦于 Node.js 下还没有成熟的模块,只能在几个主流的模块中寻找了。经过大牛们的推荐和多次的压测,mysql-libmysqlclient 应该算是目前性能较好的模块了,但是对于大数据集(2000 行以后基本上结果就很难看了)的读取还是不太乐观,所以建议不要用来获取大数据集了,能做分页就分页,以下是压测结果。

mysql 2.0.0-alpha9

读取 1000 次,每次读取 2000 条记录

// 示例代码
const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'testdb'
});

let start = Date.now();
for (let i = 0; i < 1000; i++) {
  connection.query('SELECT * FROM large_table', function(err, results) {
    if (err) throw err;
  });
}
connection.end();

console.log(`耗时 ${Date.now() - start} ms`);

写入 10000 条记录,每次写入 1 条

// 示例代码
const mysql = require('mysql');
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'testdb'
});

let start = Date.now();
for (let i = 0; i < 10000; i++) {
  connection.query('INSERT INTO test_table SET ?', {name: `Test${i}`, age: 20 + i}, function(err, results) {
    if (err) throw err;
  });
}
connection.end();

console.log(`耗时 ${Date.now() - start} ms`);

mysql-libmysqlclient 1.5.2

读取 1000 次,每次读取 2000 条记录

// 示例代码
const mysqlLib = require('mysql-libmysqlclient');
const connection = mysqlLib.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'testdb'
});

let start = Date.now();
for (let i = 0; i < 1000; i++) {
  connection.query('SELECT * FROM large_table', function(err, results) {
    if (err) throw err;
  });
}
connection.end();

console.log(`耗时 ${Date.now() - start} ms`);

写入 10000 条记录,每次写入 1 条

// 示例代码
const mysqlLib = require('mysql-libmysqlclient');
const connection = mysqlLib.createConnection({
  host: 'localhost',
  user: 'root',
  password: 'password',
  database: 'testdb'
});

let start = Date.now();
for (let i = 0; i < 10000; i++) {
  connection.query('INSERT INTO test_table SET ?', {name: `Test${i}`, age: 20 + i}, function(err, results) {
    if (err) throw err;
  });
}
connection.end();

console.log(`耗时 ${Date.now() - start} ms`);

通过上述代码和压测结果可以看出,对于大数据集的读取,mysql 模块的表现较差,而 mysql-libmysqlclient 模块虽然在读取性能上有所提升,但仍然不理想。因此,在实际应用中建议使用分页查询来优化性能。


针对 Node.js 下关于 mysqlmysql-libmysqlclient 的性能测试问题,可以总结出以下几点观察和建议:

  1. 读取性能

    • 使用 mysql 模块进行大量数据(例如 2000 条记录)的读取时,性能相对较低,平均每秒大约 94 到 95 次请求。
    • 使用 mysql-libmysqlclient 模块进行同样的读取操作时,性能有所提升,平均每秒约 206 到 208 次请求。
  2. 写入性能

    • 在写入性能方面,mysql 模块的表现优于 mysql-libmysqlclient。使用 mysql 模块写入 10000 条记录时,平均每秒处理约 2900 到 2950 条记录。
    • 而使用 mysql-libmysqlclient 模块时,写入速度更快,平均每秒处理约 3670 到 3750 条记录。

建议

  • 对于需要读取大量数据的情况(如超过 2000 条记录),考虑使用分页技术,以避免一次性加载大量数据导致的性能瓶颈。
  • 如果读取性能是关键指标,可以优先考虑 mysql-libmysqlclient 模块,尽管其性能相比 mysql 模块仍有差距,但在某些场景下可能更为合适。
  • 对于频繁的写入操作,mysql 模块通常表现更好。

示例代码

为了帮助理解如何使用这两个模块进行基本的读取和写入操作,这里提供简单的示例代码。

读取示例

const mysql = require('mysql');

// 创建数据库连接
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'your_username',
  password: 'your_password',
  database: 'your_database'
});

connection.connect();

connection.query('SELECT * FROM your_table LIMIT 2000', (error, results) => {
  if (error) throw error;
  console.log(results);
});

connection.end();

写入示例

const mysql = require('mysql');

// 创建数据库连接
const connection = mysql.createConnection({
  host: 'localhost',
  user: 'your_username',
  password: 'your_password',
  database: 'your_database'
});

connection.connect();

for (let i = 0; i < 10000; i++) {
  connection.query('INSERT INTO your_table SET ?', {column_name: 'value'}, (error) => {
    if (error) throw error;
  });
}

connection.end();

这些代码示例展示了如何使用 mysql 模块进行基本的读取和写入操作。你可以根据实际需求调整查询语句和表名。

回到顶部