mysql2是当前Node.js操作MySQL最推荐的选择,因其性能更优、支持Promise和预处理语句、持续活跃维护;原生mysql库已停止更新,不支持Promise且存在安全与性能缺陷。
Node.js 操作 MySQL,mysql2 是当前最推荐、最主流的选择,它兼容原生 mysql 库的 API,但性能更好、支持 Promise 和预处理语句,且持续维护活跃。
mysql 库?原生 mysql(即 mysqljs/mysql)已进入维护模式,不再新增功能,且不支持 Promise、流式大结果集处理效率低、预处理语句有安全风险(需手动转义)。实际项目中已普遍被 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 表示不限制等待队列长度,避免请求被静默丢弃如果只是简单 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+)确保连接归还。