结论:MySQL慢查询优化的关键步骤包括开启慢查询日志、分析执行计划、使用索引优化查询、调整表结构和配置参数,以及定期监控和维护。具体操作:1. 设置slow_query_log=1和long_query_time=1;2. 用EXPLAIN分析SQL;3. 创建合适索引避免全表扫描;4. 分页优化用覆盖索引;5. 调优innodb_buffer_pool_size等参数。
来源1
首先,开启慢查询日志是优化MySQL性能的第一步。在my.cnf配置文件中添加:slow_query_log=1,slow_query_log_file=/var/log/mysql/slow.log,long_query_time=2。这样就能记录执行时间超过2秒的查询语句。然后使用mysqldumpslow工具分析日志,找出最耗时的SQL。
来源2
使用EXPLAIN命令查看查询执行计划是关键。EXPLAIN SELECT * FROM users WHERE age > 18; 会显示type、key、rows等信息。如果type是ALL,说明全表扫描,需要加索引。key为NULL表示未使用索引,Extra中的Using filesort提示需要优化排序。
来源3
索引优化至关重要。对于频繁查询的字段,建立单列索引或复合索引。但注意,索引过多会增加写入开销。优先为WHERE、JOIN、ORDER BY、GROUP BY字段建索引。避免在索引列上使用函数,如WHERE DATE(create_time)=’2023-01-01’改为范围查询。
来源4
表结构优化也很重要。将大字段如TEXT移到单独表,避免频繁JOIN。使用合适的数据类型,如INT代替VARCHAR(11)存储ID。水平分表或分库处理大数据量表。定期执行OPTIMIZE TABLE重建索引。
来源5
配置参数调优:增大innodb_buffer_pool_size到物理内存的70%,设置innodb_log_file_size=1G。查询缓存用query_cache_type=1,但MySQL8.0已移除,考虑Redis缓存。连接池如使用ProxySQL管理连接数。
来源6
分页优化常见问题:LIMIT 10000,10会先扫描前10010行再丢弃。改为覆盖索引或记录最大ID分页:SELECT * FROM table WHERE id > last_id LIMIT 10。
来源7
监控工具:pt-query-digest分析慢查询,Percona Toolkit套件强大。结合show processlist实时查看锁等待。Grafana+Prometheus可视化监控数据库性能。
FAQ
Q: 如何快速开启慢查询日志?
A: 在my.cnf加slow_query_log=1, long_query_time=1,重启MySQL。
Q: EXPLAIN中type=all什么意思?
A: 全表扫描,性能差,需要加索引。
Q: 索引失效的原因有哪些?
A: 函数包裹列、类型不匹配、OR条件、LIKE %xx%等。
Q: 怎么优化大表分页?
A: 用自增ID过滤代替OFFSET。