Ubuntu 上 Node.js 数据库操作优化实战
一 连接池与驱动配置
const mysql = require('mysql2/promise');
const pool = mysql.createPool({
host: 'localhost',
user: 'app_user',
password: process.env.DB_PASSWORD,
database: 'myapp',
connectionLimit: 20, // 依据压测与DB上限调整
queueLimit: 20, // 超限快速失败
acquireTimeout: 10000, // 获取连接超时
timeout: 10000, // 查询超时
});
// 使用示例(在最小作用域内使用并释放)
async function getUsers() {
const [rows] = await pool.execute('SELECT id, name FROM users WHERE active = ?', [1]);
return rows;
}
const { Pool } = require('pg');
const pool = new Pool({
host: 'localhost',
user: 'app_user',
password: process.env.DB_PASSWORD,
database: 'myapp',
max: 20,
idleTimeoutMillis: 30000,
connectionTimeoutMillis: 2000,
});
async function getOrders() {
const { rows } = await pool.query('SELECT id, total FROM orders WHERE status = $1', ['open']);
return rows;
}
二 查询与索引优化
-- 复合索引:常用于 WHERE a=? AND b=? 的场景
CREATE INDEX idx_a_b ON t(a, b);
-- 键集分页(避免大 OFFSET)
SELECT id, name FROM t WHERE id > ? ORDER BY id LIMIT 20;
三 批量与事务处理
async function bulkInsertUsers(users) {
const sql = 'INSERT INTO users (name, email) VALUES ?';
const values = users.map(u => [u.name, u.email]);
await pool.execute(sql, [values]);
}
四 运行环境与系统层面优化
五 监控 压测与排错