面试题答案
一键面试可能原因
- 查询负载过高:大量复杂查询或高并发查询,使MySQL需耗费大量CPU资源进行查询解析、优化与执行,导致
us
高。同时,查询涉及大量磁盘I/O操作,如全表扫描读取大量数据,造成wa
高。例如复杂的多表连接查询、未优化的子查询。 - 索引缺失或不合理:缺少必要索引,查询无法利用索引快速定位数据,引发全表扫描,增加I/O操作,提升
wa
。而且全表扫描时CPU需处理大量数据,使us
升高。比如对频繁用于WHERE
子句过滤的列未建索引。 - 磁盘I/O性能瓶颈:磁盘读写速度慢,如使用老旧机械硬盘,或磁盘I/O队列过长,MySQL等待磁盘I/O完成时间长,
wa
升高。同时,为处理等待结果,CPU需保持活跃,也拉高us
。 - 数据库配置不合理:缓冲池设置过小,无法缓存足够数据和索引,增加磁盘I/O,使
wa
高。同时,为处理频繁I/O请求,CPU使用率us
也会上升。线程池配置不当,过多或过少线程,影响查询并发处理能力,导致CPU和I/O资源利用不佳。
优化策略
- 优化查询:
- 分析慢查询日志,找出耗时查询,使用
EXPLAIN
关键字分析查询执行计划,针对性优化。如改写复杂子查询为连接查询以提升效率。 - 避免全表扫描,对经常用于过滤条件的列建立合适索引,但避免过度索引,防止索引维护开销过大。
- 分析慢查询日志,找出耗时查询,使用
- 调整索引:
- 定期使用
ANALYZE TABLE
语句更新索引统计信息,让查询优化器做出更优决策。 - 利用
pt-index-usage
等工具分析索引使用情况,删除未使用或低效索引。
- 定期使用
- 提升磁盘I/O性能:
- 升级磁盘,如更换为固态硬盘(SSD),提升读写速度。
- 优化磁盘I/O队列,调整系统参数,如
elevator
调度算法,提升I/O调度效率。 - 对数据库文件进行合理布局,将数据文件、日志文件等分布在不同磁盘或磁盘阵列上,减少I/O竞争。
- 优化数据库配置:
- 根据服务器内存大小合理调整缓冲池大小,让更多数据和索引可缓存,减少磁盘I/O。
- 优化线程池参数,依据系统负载和硬件资源确定合适线程数,提高并发处理能力。如调整
innodb_thread_concurrency
等参数。