分享新加坡服务器数据库优化的实战经验,从慢查询到高并发的完整优化流程。
数据库性能直接影响用户体验。本文分享新加坡服务器数据库优化的实战经验。
问题一:慢查询导致响应慢 表现:接口响应 2 秒以上,慢查询日志有大量记录。 可能原因:缺索引;SQL 写法不当;数据量过大。 排查步骤:开启慢查询日志;EXPLAIN 分析;检查索引。 快速修复:添加缺失索引;优化 SQL 写法;分页查询。
问题二:连接数打满 表现:too many connections,应用无法连接数据库。 可能原因:连接泄漏;慢查询占满连接;配置过低。 排查步骤:show processlist;检查应用连接池。 快速修复:调大 max_connections;kill 慢查询;修复连接泄漏。
问题三:主从延迟高 表现:从库数据落后主库几分钟,读到旧数据。 可能原因:主库写入量大;从库性能不足;大事务。 排查步骤:show slave status;对比主从性能。 快速修复:开启并行复制;减少大事务;优化写入。
问题四:磁盘 IO 高 表现:iostat %util 100%,查询超时。 可能原因:大量随机 IO;全表扫描;日志写入。 排查步骤:iotop 看进程;分析查询;检查日志。 快速修复:优化索引减少扫描;日志写独立磁盘;升级 NVMe。
问题五:内存不足 表现:OOM killer 杀进程,数据库频繁重启。 可能原因:缓冲池设置过大;连接数过多;其他进程占用。 排查步骤:free -m;看 innodb_buffer_pool_size。 快速修复:调整缓冲池大小;限制连接数;增加内存。
核心优化参数 ``` [mysqld] innodb_buffer_pool_size = 物理内存的 60-70% innodb_buffer_pool_instances = 8 innodb_flush_log_at_trx_commit = 2 sync_binlog = 1000 innodb_flush_method = O_DIRECT innodb_io_capacity = 2000 max_connections = 500 query_cache_type = 0 ```
索引优化 1) 为 WHERE、JOIN、ORDER BY 字段建索引 2) 联合索引遵循最左前缀 3) 避免索引失效(函数、类型转换、OR) 4) 定期分析慢查询,添加索引
分库分表 1) 垂直分库:按业务模块拆分 2) 水平分表:按 ID 哈希或时间范围 3) 读写分离:主写从读 4) 分片中间件:ShardingSphere、MyCat
效果对比 | 指标 | 优化前 | 优化后 | | --- | --- | --- | | 慢查询数/分钟 | 200 | 5 | | 平均响应时间 | 1.8s | 150ms | | 连接数峰值 | 打满 | 60% | | QPS | 2000 | 15000 | | CPU 利用率 | 95% | 45% |
总结:数据库优化是系统工程。索引、SQL、配置、架构分层优化,才能支撑高并发。