mysql2是当前Node.js操作MySQL最推荐的选择,因其性能更优、支持Promise和预处理语句、持续活跃维护;原生mysql库已停止更新,不支持Promise且存在安全与性能缺陷。

Node.js 操作 MySQL,mysql2 是当前最推荐、最主流的选择,它兼容原生 mysql 库的 API,但性能更好、支持 Promise 和预处理语句,且持续维护活跃。
为什么不用原生 mysql 库?
原生 mysql(即 mysqljs/mysql)已进入维护模式,不再新增功能,且不支持 Promise、流式大结果集处理效率低、预处理语句有安全风险(需手动转义)。实际项目中已普遍被 mysql2 替代。
- 官方明确建议迁移:README 中直接指向 mysql2
-
mysql2的查询速度通常快 20%–30%,尤其在批量插入/查询时更明显 - 默认启用
typeCast类型自动转换,避免Buffer或字符串混用问题
mysql2/promise 怎么开箱即用?
直接导入 Promise 版本,避免回调嵌套,配合 async/await 写法清晰、错误可控。
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: 'localhost',
user: 'root',
password: 'password',
database: 'testdb',
waitForConnections: true,
connectionLimit: 10,
queueLimit: 0
});
async function getUser(id) {
const [rows] = await pool.execute('SELECT * FROM users WHERE id = ?', [id]);
return rows[0];
}
- 务必用
pool.execute()(而非query())触发预处理语句,防 SQL 注入 -
execute()参数必须是数组,即使只有一个值,如[id];query()支持字符串插值,但不安全 - 连接池配置中
queueLimit: 0表示不限制等待队列长度,避免请求被静默丢弃
ORM 还是原生驱动?什么场景该选哪个?
如果只是简单 CRUD、对性能敏感、需要精细控制 SQL 或复用现有查询逻辑,直接用 mysql2 更轻量、调试直观;若业务模型复杂、频繁关联查询、团队倾向声明式开发,可考虑 Prisma 或 Drizzle ORM(它们底层也默认使用 mysql2)。
-
Prisma:强类型、自动生成客户端、迁移友好,但启动略重,不适合极简脚本 -
Drizzle ORM:编译时 SQL 构建、零运行时开销,适合 TypeScript 重度用户 - 纯
mysql2:无抽象层,SQL 完全自主,出错时堆栈直达执行点,排查快
真正容易被忽略的是连接泄漏——忘记 await pool.end() 或没正确处理异常导致连接不释放。生产环境务必用 try/catch/finally 包裹或使用 using(Node.js 20.12+)确保连接归还。










