慢查询(Slow SQL)
一句话:某条数据库查询执行时间过长,拖慢整个功能响应速度,常见原因是缺索引、查询条件不合理、或者一次查询了过多数据。
它是什么
慢查询指执行时间明显超出预期的SQL语句,是导致页面加载慢、接口超时的常见根源。大部分数据库支持记录慢查询日志,可以用来定位是哪条SQL拖慢了系统。
适合干什么
- 页面/接口响应慢需要定位原因
- 系统随着数据量增长逐渐变慢
不适合干什么
- 数据库根本连不上的情况(那是database-connection-failed,不是查询慢的问题)
普通人怎么用
开启数据库的慢查询日志功能,找到耗时最长的几条SQL,用EXPLAIN命令分析有没有用上索引,缺索引是最常见的原因。
进阶用户怎么用
常见优化方向:给合适字段加索引、避免SELECT *只查需要的字段、避免在WHERE条件里对索引字段做函数运算、大数据量分页查询用游标而不是OFFSET、复杂统计考虑用汇总表代替实时计算。
常见误区
- 以为服务器性能不够是慢查询的主因,实际大部分慢查询问题是SQL写法或索引缺失导致的,加机器配置往往治标不治本
- 只优化了查询本身,没考虑随着数据量增长同样的SQL会越来越慢,需要预判数据增长做提前优化
和相似工具的区别
- 和 database-timeout 的关系:慢查询是原因,超时是结果,优化慢查询往往能直接解决超时问题
入门步骤
- 开启慢查询日志
- 找出耗时最长的SQL
- 用EXPLAIN分析并针对性优化(通常是加索引)