MySQL的慢查询优化?
答:慢查询优化的前提是定位到响应慢的SQL
,这可以通过启用慢查询日志来实现。默认情况下,MySQL
并不启用慢查询日志,我们需要手动开启这个参数。通过日志定位到慢查询的SQL
之后,我们可以使用 EXPLAIN
语句来分析这个 SQL
,进而发现问题所在。导致慢查询的原因有很多,下面列举几种常见的原因,以及对应的解决方案:
- 向数据库请求了多余的数据: 很多时候,我们的
SQL
返回的结果会超出我们的需要,例如实际上它返回了更多的行,而我们只要其中的一部分。又或者我们要求返回所有的列,实际上却只有其中少数的列。对于这类问题,我们可以通过LIMIT
控制返回的行数,尽量不用SELECT *
避免查询到过多的列。 - SQL复杂导致无法利用缓存: 处于业务的需要,我们经常会写出比较复杂的
SQL
,这自然包括复杂的关联查询。由于复杂SQL
返回的结果涉及多张表、多个条件、甚至各种函数,这样的SQL
每次返回的结果势必不同,所以很难利用到数据库的缓存。如果我们将复杂SQL
进行拆分,变成若干简单的SQL
,那么其中有些SQL
由于条件不变,就可以利用到数据库的缓存了,从而让查询效率得以提升。 - 没有选择正确的索引: 我们都知道,创建索引是提高查询效率的一个常用手段,事实上我们也经常会这样做。但是,很多时候我们创建了索引,通过
EXPLAIN
查看会发现并没有走这个索引,最终导致SQL
执行变慢。所以,不是把索引创建出来就算完成任务,还要分析索引的选择性,根据业务条件不断的优化索引,从而增加索引的命中率。
加分回答
答: 除上述优化的方向之外,SQL
中还有很多地方都有优化的空间,例如:COUNT()
、关联查询、子查询、GROUP BY
、LIMIT
、UNION
等。总体来说,不同的情况要区别对待,但所有优化的背后是基于慢查询日志的定位。另外,为了能够发现问题的本质,还需要对MySQL
执行查询的过程有所了解:
- 客户端发送一条查询
SQL
给服务器; - 服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果;
- 服务器进行
SQL
解析和预处理,再由优化器生成对应的执行计划; - 服务器根据优化器生成的执行计划,调用存储引擎的
API
来执行查询; - 将结果返回给客户端。