MySQL查询慢的原因
首先需要了解mysql 的查询流程,以我们的 Java 代码为例,Java 应用会带着账号密码尝试和 MySQL 建立网络连接,MySQL 的连接管理模块会对该连接进行管理,连接完成之后,Java 应用会对 MySQL数据库发送 sql 语句,MySQL 收到查询语句后,会在分析器中判断是否有语法错误,比如单词拼写错误等,接下来是优化器,它会根据一些规则来选择合适的索引,生成执行计划,执行器会调用存储引擎的接口函数,存储引擎是真正读写数据的地方。现在最常用的是innodb 存储引擎。由于磁盘读写数据比较慢,因此 innodb 内加了一层内存提速,叫做 buffer pool,里面既放行数据,也放索引数据,查询 sql 到达 innodb 中,会根据前面优化器里计算得到的索引去查询相应的索引页,如果索引页不在buffer pool 中,则先从磁盘加载索引页到 buffer pool 中,再通过索引页查询得到数据页的位置,如果这些数据页不在 buffer pool 中,则从磁盘加载到到 buffer pool,最后将得到的一行行数据返回给应用程序,根据上述流程可以总结以下三点:
1、 数据库慢查询,一般是优化器选错索引导致,这类问题可以通过 explain 命令排查,查看索引的命中情况。
2 、连接数不够,这个问题受到数据库和客户端两侧的影响,首先是MySQL的 连接数过小, 调整相应大小就行,数据库连接数是 100-16384;其次是应用端连接数过小,由于MySQL 和应用的连接是 tcp 长连接,连接比较耗时,因此一般会在应用端建立一个连接池,用来存放长连接,sql 语句查询时,先取出连接使用,用完再将连接放回去。如果说调整一侧没有效果,可以尝试调整双方。
3、buffer pool 太小,buffer pool存放数据页和索引页,因此buffer pool 越大,能存放的数据页也就越多,相应的 sql 查询时命中率也就越高,查询速度也就越快。