MySQL与MySQL2在NodeJS中有什么区别?

62

我已经阅读了以下内容:

MySQL和mysql2 gem之间的区别

到目前为止,我只使用过NodeJS的MongoDB,并且希望能够学习MySQL以满足任何关系型数据库的需求。在研究MySQL和NodeJS时,我发现了MySQL2的存储库,与MySQL官方网站无关。我猜测已经创建了一些API,使得开发像NodeJS和Ruby这样的语言更快。从NodeJS的角度来看,我猜想仍然在服务器上运行常规MySQL数据库,但需要使用这些新API与其交互。例如:

https://github.com/sidorares/node-mysql2/blob/master/README.md

我看到过一个网站,他们进行性能基准测试,发现NodeJS和MySQL的性能很低,而NodeJS和MySQL2的性能非常高。

此信息来源: php-nodejs-mysql-and-mongo

该文章中的图片:

enter image description here

我是否只需在服务器上使用常规MySQL数据库并使用此mysql2 API?还是有不同的MySQL实现可以与此API一起使用?

6个回答

45

这只是由普通人编写的两个不同的API。区别在于命令的语法和性能,只需安装两者,为了实现您的目标进行自己的测试并选择更适合您的那一个。

这里是NPMCompare进行的比较结果:


好的,我假设我需要安装的两个API是:felixge/node-mysqlsidorares/node-mysql2,此外我还需要在MySQL中运行一个数据库,以便从NodeJS连接。 - Eric Bishard
1
我现在明白了。felixge/node-mysqlsidorares/node-mysql2都是用于在NodeJS中与MySQL交互的API。类似于我用来与MongoDB交互的驱动程序或mongodb模块。我可以使用其中任何一个,但应该根据自己的需求进行测试,并从中选择用于生产的API。我认为这就是这里所说的内容。 - Eric Bishard
1
felixge/node-mysqlsidorares/node-mysql2在代码上几乎是兼容的,唯一的区别在于require部分。你可以阅读felixge/node-mysql的文档,但使用sidorares/node-mysql2来运行示例。 - Eugene Mala
仅供参考,根据我的经验,flexge/node-mysql 与 JSON 类型(JSON_OBJECT、JSON_ARRAY 等)的兼容性不是很好。实际上,您需要解析查询结果才能真正使用它。相反,sidorares/node-mysql2 在对应列为 JSON 类型时似乎可以本地解析它,这可以节省很多时间。 - Luxior

27

摘自https://www.npmjs.com/package/mysql2

"MySQL2与mysqljs大部分API兼容,支持大多数功能。此外,MySQL2还提供以下额外功能:

  • 更快/更好的性能
  • 预处理语句
  • MySQL二进制日志协议
  • MySQL服务器
  • 扩展的编码和排序支持
  • Promise包装器
  • 压缩
  • SSL和认证开关
  • 自定义流
  • 连接池

仅针对前两个特性是更好的:更快和更安全

"

2
连接池也更好,速度更快。但是普通的mysql包也有连接池。 - Melroy van den Berg
1
mysql2 的改进并不是微不足道的。mysql2 有内置的 Promisified API。您可以尝试自己编写,但这将耗费大量开发时间。准备好的语句支持也是我转到 mysql2 的主要原因。由于 SQL 注入攻击的原因,这基本上是今天的一个要求。 - kiwicomb123
你也可以在mysql库中使用promises(async/await)。只需pool.query = util.promisify(pool.query),现在你就可以愉快地使用result = await db.query()了。 - Wes

7

我在项目中实现 npm i mysql 依赖时遇到了很多问题。 首先,如果您遵循 MVC 架构,使用 mysql 在提取和在服务器和客户端之间 send 数据时会变得繁琐。 npm i mysql2 简化了这个过程,例如执行查询就像这样简单:

对于 mysql 依赖项 connection.query(sql, (err, res) => {*some fn here*}) 返回包括查询成功结果在内的所有行。 而 mysql2 依赖项 connection.execute(sql) 仅返回查询结果而不是行。


3
另一个区别是,mysql npm模块仍不支持MySQL 8中引入的caching_sha2_password身份验证,而mysql2 npm模块则支持。 这就是我迁移到mysql2的原因。

3
如果您查看使用mysql和mysql2的源代码,可以发现在该图表中他们都使用了mysql API。唯一的区别是在标记为MySQL的一个中,每次都关闭了连接。因此,要点是不要在每次使用之后关闭连接。据说mysql2 API更快,但我还没有看到任何相关数据。
这里有一个用于图表数据的“mysql2”代码。请注意,API仍然是mysql而不是mysql2:
var sys = require('sys'),
http = require('http'),
mysql = require('mysql')
client = null;

client = mysql.createClient({
          user: 'root',
          password: '',
});
client.query('USE mongo');

http.createServer(function(req, res) {
        client.query(
                  'SELECT * FROM basic WHERE id = '+Math.floor(Math.random()*100000),
                  function selectCb(err, results, fields) {
                    if (err) {
                      res.writeHead(200, {'Content-Type': 'text/html'});
                          res.write('Bad');
                          res.end();
                      throw err;
                    }

                    res.writeHead(200, {'Content-Type': 'text/html'});
                        res.write('Gooood');
                        res.end();
                  }
                );
}).listen(8080);

2
客户端查询('USE mongo'),笑死我了。 - Unreality

0
为什么那些参与mysql2开发的人不能改进初始版本的mysql呢?我只是好奇,因为有像bootstrap2或tailwindcss2这样的东西听起来很滑稽,而不是为了贡献和统一形成一个良好的社区。

这并没有回答问题。一旦你拥有足够的声望,你就可以评论任何帖子;相反,提供不需要提问者澄清的答案。- 来自审核 - l2ysho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接