MySQL作为被广泛应用的关系型数据库,帮助大家完成数据存储、数据处理以及数据分析等相关工作。在使用MySQL过程中最常遇到的问题大约就是慢查询或者运算时间很长的问题,那么时间都去哪儿了呢?
使用SHOW PROFILE
MySQL提供的 SHOW PROFILE语法 ,可以帮助我们分析查询执行的每个步骤极其花费的时间。我们可以通过执行 set profiling=1 来开启此功能。先让我们看个例子
- select count(*) from user;
- show profile;
通过show profile命令我们可以查看时间主要消耗在了Sending data阶段,Sending data状态描述的是读和处理SELECT涉及的行以及发送数据到客户端:
The thread is reading and processing rows for a SELECT statement, and sending data to the client. Because operations occurring during this state tend to perform large amounts of disk access (reads), it is often the longest-running state over the lifetime of a given query.
其他状态的解释请参考 手册 。通过分析查询每个步骤消耗的时间,我们可以有针对性的进行优化。让我们来查看另一个例子。
- select * from user order by email desc limit 1000, 10;
- show profiles;
- show profile for query 2;
通过上边的例子,我们可以发现时间主要花到了排序上。
使用 EXPLAIN
我们可以使用EXPLAIN来获取关于查询执行计划的信息, EXPLAIN命令等价于DESCRIBE/DESC。EXPLAIN命令是查看查询优化器如何决定执行查询的主要方法。
EXPLAIN命令可以帮助我们查看查询我们的SQL语句可能用到的索引(possible_keys)以及影响的行数(rows),可以帮我们更好的定位慢的原因。每列值得具体解释请参考 手册 。此外EXPLAIN也可以看表结构。
目前MySQL提供的工具在分析查询性能定位上还是比较弱的,但是造成查询性能底下的原因还是比较明确的:就是访问的数据太多。那么通过调整索引结构、调整检索语句的条件以及重构查询等均能收到不错的优化效果。
通过上述两个工具我们基本上能够确定我们的SQL在干什么以及消耗了多少时间,也能够了解查询优化器为我们做的一些工作,更具它们为我们提供的信息,我们可以调整我的查询方式来提高我们的查询效率。