为什么数据库常是瓶颈
在 DMIT 云服务器上,多数性能问题并非出在 CPU 或带宽,而在数据库:慢查询、缺失索引、连接数失控、缓冲池过小都会拖垮整个站点。本文以 MySQL / MariaDB 与 PostgreSQL 为例,给出在 DMIT 上可落地的优化方法。
先建立基线
优化前先量化,不要凭直觉。启用慢查询日志,找出最耗时的语句:
-- MySQL: 开启慢查询日志(>1s 记录)
SET GLOBAL slow_query_log = 'ON';
SET GLOBAL long_query_time = 1;
-- 用 mysqldumpslow 汇总
mysqldumpslow -s t /var/log/mysql/slow.log | head -20
PostgreSQL 用 pg_stat_statements 扩展统计最慢查询。先解决 Top 5 慢查询,通常能带来立竿见影的提升。
索引优化
- 为
WHERE、JOIN、ORDER BY涉及的列建索引 - 复合索引遵循最左前缀原则
- 避免对索引列使用函数或类型转换(会导致索引失效)
- 定期用
ANALYZE更新统计信息
-- 查看可能缺失的索引(MySQL)
SELECT * FROM sys.schema_unused_indexes;
-- PostgreSQL 缺失索引建议
SELECT * FROM pg_stat_user_tables WHERE seq_scan > 1000;
连接池与最大连接数
应用直连数据库、每个请求开一个新连接,会迅速耗尽连接数。应使用连接池(如 HikariCP、PgBouncer):
# PostgreSQL + PgBouncer 示例 (pgbouncer.ini)
[databases]
mydb = host=127.0.0.1 port=5432 dbname=mydb
[pgbouncer]
pool_mode = transaction
max_client_conn = 100
default_pool_size = 20
同时把应用侧超时设短(如 5s),避免慢查询堆积。更多系统层调优见《性能调优指南》。
缓冲池与内存
InnoDB 的 innodb_buffer_pool_size 是性能关键。经验值:专用数据库服务器可设为物理内存的 60-75%,但需为系统与其他进程留出余量。
# /etc/mysql/mysql.conf.d/mysqld.cnf
innodb_buffer_pool_size = 2G
innodb_buffer_pool_instances = 4
max_connections = 200
修改后用 mysqladmin status 观察命中率,目标 buffer pool hit rate > 99%。内存受限时,参考《成本优化策略》评估升配。
读写分离与缓存
读多写少的场景,可加 Redis 缓存热点数据,或在 DMIT 上部署只读副本分担读压力:
# 安装 Redis
apt install redis-server -y
# 应用层:先查 Redis,未命中再查 DB 并回填
GET user:123
# miss → SELECT ... → SETEX user:123 300 "..."
定期维护
- 每周
OPTIMIZE TABLE/VACUUM ANALYZE回收碎片 - 配置自动备份(见《监控与备份》)
- 监控慢查询趋势,避免回归
相关文章
《性能调优指南》、《故障排查指南》、《Docker 部署指南》。
本文核对日期:2026-08-18。具体参数以官方文档与实例规格为准。