1.为什么聊这个话题
在工作中,我们经常遇到各种线上问题,如cpu 和 load都变高了,full gc频繁,线程池满了等,经过各种排查可能最后有挺多原因是跟数据库出现了慢查询或者不合理的查询导致等一系列等连锁反应。
在各种大促性的活动我们会做各种手段去保证系统的稳定性,如压测,限流,缓存,消息异步化,很多情况下除了计算密集型等应用,很多都是为了防止我们的数据库挂掉。
数据库性能提升是我们能够放心做应用服务器水平扩容的一个最重要的前提。否则如果你的数据库查询性能差的话,一个慢查询就可能导致mysql服务器运行中线程数飙高,cpu飙高,rt延长。进而导致应用服务器的处理线程耗时延长,最终导致线程池满,cpu,load都会飙高。如果依赖你的服务的其它服务器没有做好降级熔断处理,那可想而知,他的应用也会挂掉。这个慢sql就是压死你的最后一棵稻草了。
后面作为一个专题和大家一起探讨聊聊mysql的慢查询和我在工作中遇到的实际问题的案例分享。今天先聊下
慢查询的一些基础和我的一些小套路。
2.查询慢的常见原因
一次数据库的查询大体需要经历客户端,应用服务端,mysql服务端sql解析,优化器索引评估,执行计划生成,执行查询,返回给调用端。
我们重点关注请求到mysql之后,mysql需要从存储引擎(目前大多使用innodb)中读取数据