ARTICLE

DMIT 数据库优化:MySQL/PostgreSQL 慢查询与索引调优

DMIT 上 MySQL/MariaDB 与 PostgreSQL 的慢查询定位、索引、连接池与缓冲池优化方法。

为什么数据库常是瓶颈

在 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。具体参数以官方文档与实例规格为准。

NEXT STEP

看完教程,选一台合适的 DMIT

用套餐快照按预算与线路筛选,或直接前往官网查看实时库存。

推广披露:通过链接购买可能为推荐者带来佣金,不会增加你的购买价格。