1. 优化数据库索引
为经常用于WHERE、JOIN、ORDER BY或GROUP BY的列创建索引,可大幅减少数据库扫描时间。例如,为用户ID、电子邮件等高频查询字段添加索引:CREATE INDEX idx_user_email ON users(email)。对于多列查询条件,使用复合索引(如CREATE INDEX idx_user_name_email ON users(name, email)),能进一步提升联合查询效率。需定期监控索引使用情况,删除未使用或冗余索引,避免影响插入、更新操作的性能。
2. 使用数据库连接池
通过连接池(如pg-pool for PostgreSQL、mysql2 for MySQL)管理数据库连接,避免频繁创建和销毁连接的开销。合理配置连接池参数:connectionLimit(根据数据库负载设置最大连接数,如10-20)、idleTimeoutMillis(空闲连接超时时间,如30秒)、queueLimit(等待队列长度,如100),确保连接池稳定运行。连接池能有效复用连接,减少连接建立的时间消耗。
3. 优化查询语句
SELECT *:只查询需要的列,减少数据传输量(如SELECT id, name, email FROM users而非SELECT * FROM users)。JOIN:用JOIN替代子查询,减少数据库扫描次数(如SELECT orders.id, customers.name FROM orders JOIN customers ON orders.customer_id = customers.id)。LIMIT和OFFSET分页,避免一次性返回大量数据(如SELECT * FROM products LIMIT 10 OFFSET 20)。4. 引入缓存机制
对频繁访问且不常变化的数据(如商品分类、用户信息),使用缓存(如Redis、Memcached)存储查询结果。查询时先检查缓存,若命中则直接返回,否则查询数据库并更新缓存。例如,使用Redis缓存用户信息:client.get('user:1', (err, data) => { if (data) return res.json(JSON.parse(data)); else queryDatabase(userId, (result) => { client.setex('user:1', 3600, JSON.stringify(result)); res.json(result); }) })。缓存能显著减少数据库查询次数,提升响应速度。
5. 分页与批量操作
LIMIT和OFFSET分页,避免一次性加载所有数据。例如,前端传递page和pageSize参数,后端计算OFFSET(offset = (page - 1) * pageSize),执行分页查询。INSERT INTO users (name, email) VALUES ('John', 'john@example.com'), ('Jane', 'jane@example.com'))。6. 监控与分析慢查询
使用数据库自带的慢查询日志(如MySQL的slow_query_log)或EXPLAIN ANALYZE命令分析查询性能。例如,MySQL中开启慢查询日志:SET GLOBAL slow_query_log = 'ON'; SET GLOBAL long_query_time = 1;,然后通过SHOW VARIABLES LIKE 'slow_query_log_file'找到日志文件,分析执行时间长的查询。EXPLAIN ANALYZE可显示查询执行计划,帮助识别索引缺失、全表扫描等问题。
7. 数据库配置优化
根据应用需求调整数据库配置参数,提升查询性能。例如:
innodb_buffer_pool_size,设置为物理内存的50%-70%),减少磁盘I/O。max_connections,根据并发量设置,如100-200),避免连接过多导致资源耗尽。innodb_flush_log_at_trx_commit(设为2,牺牲部分持久性换取性能,适用于高并发写入场景)。8. 硬件与环境优化