先开启慢查询日志定位问题SQL,再通过索引优化、SQL改写、表结构与配置调整提升性能。1. 配置slow_query_log记录执行时间长的SQL,并用pt-query-digest分析;2. 为WHERE、ORDER BY等字段建索引,避免函数操作和隐式转换导致索引失效;3. 减少SELECT *、优化大分页、拆分复杂查询;4. 选用合适数据类型,拆分大表,调整innodb_buffer_pool_size等参数,定期执行ANALYZE TABLE和OPTIMIZE TABLE。每一步需结合业务验证效果,避免盲目优化。

MySQL慢查询优化是提升数据库性能的关键环节。核心思路是从索引设计、SQL语句写法、表结构合理性以及系统配置等多方面入手,定位并解决性能瓶颈。
1. 开启慢查询日志定位问题SQL
要优化慢查询,先得知道哪些SQL执行慢。通过开启慢查询日志,可以记录超过指定时间的SQL语句。
操作建议:- 在my.cnf中配置:
- slow_query_log = ON
- slow_query_log_file = /var/log/mysql/slow.log
- long_query_time = 1
SHOW VARIABLES LIKE 'slow_query%';确认是否开启。
- 配合mysqldumpslow或pt-query-digest分析日志,找出高频或耗时长的SQL。
2. 合理使用索引提升查询效率
索引是优化查询最有效的手段之一,但不合理的使用反而会影响性能。
关键点:- 对WHERE、ORDER BY、GROUP BY涉及的字段建立索引。 - 避免索引失效:如在字段上使用函数(
WHERE YEAR(create_time) = 2023)、隐式类型转换、前缀模糊查询(LIKE '%abc')。
- 使用复合索引注意最左前缀原则,例如索引(a,b,c),查询条件必须包含a才能生效。
- 利用EXPLAIN查看执行计划,确认是否走索引(type为ref或range较好,避免ALL全表扫描)。
3. 优化SQL语句写法
低效的SQL写法会显著拖慢查询速度,需从逻辑层面优化。
- 减少SELECT *,只查需要的字段,降低IO和网络开销。 - 避免在循环中执行SQL,尽量批量处理。 - 大分页优化:用主键或索引字段“记住位置”,例如:
- 原语句:
SELECT * FROM user LIMIT 100000, 10 - 优化后:
SELECT * FROM user WHERE id > 100000 LIMIT 10
4. 表结构与配置调优
良好的表设计和合理配置能从根本上减少慢查询发生。
建议措施:- 选择合适的数据类型,如用INT代替VARCHAR存数字,用TINYINT表示状态。 - 适当拆分大表(垂直或水平分区),尤其是日志类或历史数据表。 - 调整MySQL参数:
- innodb_buffer_pool_size 设置为物理内存的50%-70%,提升缓存命中率。
- query_cache_type 和 query_cache_size(注意MySQL 8.0已移除查询缓存)。
- max_connections 根据并发需求调整。
ANALYZE TABLE 更新统计信息,OPTIMIZE TABLE 整理碎片。
基本上就这些。关键是结合实际业务场景,用工具定位问题,逐步优化。不要盲目加索引或改配置,每一步都要验证效果。










