分析SQL性能工具-show profiles

show profiles功能

在运行每个查询以后,可以使用show profiles来查询你所运行的sql语句所涉及到的,每个状态变化的过程以及它们持续的时间。(保存最近15次的运行结果)
如果不加说明,默认的是展示上一条查询语句的内容。如果要制定某条SQL语句,可以用一下查询

SHOW PROFILE FOR QUERY n;

一些参数解释

MySQL在执行SQL查询时可能会用到临时表,一般情况下,用到临时表就意味着性能较低。
MySQL临时表分为“内存临时表”和“磁盘临时表”,其中内存临时表使用MySQL的MEMORY存储引擎,磁盘临时表使用MySQL的MyISAM存储引擎;
一般情况下,MySQL会先创建内存临时表,但内存临时表超过配置指定的值后,MySQL会将内存临时表导出到磁盘临时表;(移到磁盘,会带来IO开销)
如果在show profile诊断结果中出现了下边4条结果中的任何一条,则sql语句需要优化。
①converting HEAP to MyISAM:查询结果太大,内存不够,数据往磁盘上搬了。可以使用 tmp_table_size,MAX_HEAP_TABLE_SIZE来改变内存临时表的最大大小

②Creating tmp table:创建临时表。先拷贝数据到临时表,用完后再删除临时表。

③Copying to tmp table on disk:把内存中临时表复制到磁盘上,危险!!!

④locked。

例如:下边展示某个sql语句执行以后的各个阶段的运行时间,可以看到出现了converting HEAP to MyISAM,则需要进行优化。

mysql> show profile;

+---------------------------+----------+
| Status                    | Duration |
+---------------------------+----------+
| starting                  | 0.000111 |
| checking permissions      | 0.000010 |
| Opening tables            | 0.000018 |
| init                      | 0.000030 |
| System lock               | 0.000011 |
| optimizing                | 0.000007 |
| statistics                | 0.000014 |
| preparing                 | 0.000013 |
| Creating tmp table        | 0.000037 |
| Sorting result            | 0.000007 |
| executing                 | 0.000005 |
| Sending data              | 0.545211 |
| converting HEAP to MyISAM | 1.307225 |
| Sending data              | 0.738511 |
| Creating sort index       | 0.573640 |
| end                       | 0.000020 |
| removing tmp table        | 0.001682 |
| end                       | 0.000009 |
| query end                 | 0.000012 |
| closing tables            | 0.000016 |
| freeing items             | 0.000030 |
| logging slow query        | 0.000051 |
| cleaning up               | 0.000018 |
+---------------------------+----------+

补充

1、如何启该功能

mysql> SET profiling = 1;

2、为什么需要临时表
当工作在十分大的表上运行时,在实际操作中你可能会需要运行很多的相关查询,来获的一个大量数据的小的子集。较好的办法,不是对整个表运行这些查询,而是让MySQL每次找出所需的少数记录,将记录选择到一个临时表,然后对这些表运行查询。
1)、当某一个SQL语句关联的表在2张及以上,并且和一些小表关联。可以采用将大表进行分拆并且得到比较小的结果集合存放在临时表中。
2)、程序执行过程中可能需要存放一些临时的数据,这些数据在整个程序的会话过程中都需要用的等等。

3、临时表和内存表的区别
(MySQL中有三种虚拟表:临时表、内存表、视图)

临时表 内存表
存储 表结构和数据都存储在内存中 表结构存储在磁盘中,表数据存储在内存中
会话 单个会话独享的,是会话级别的 可以多个会话共享
引擎 临时表默认,myisam 内存表默认,memory
断开连接 表结构和表数据都没了 表结构和表数据都存在

参考:
1、MySQL中使用SHOW PROFILE命令分析性能的用法整理
2、MySQL高级知识(十一)——Show Profile

你可能感兴趣的:(数据库)