前言:
说几句废话,在日常工作当中使用的更多的ORM框架是MyBatis,写的SQL(结构化查询语言)也从来没有测试过性能。在MySQL 5.0.37之后通过自带的Profiling工具能够很好的查看到SQL的运行瓶颈。
1.SQL性能分析工具
工具:profiling
1.查看MySQL的Profiling是否打开
-- 查看profiling的参数
SHOW VARIABLES LIKE '%profil%';
-- 设置为0关闭,设置为1 开启
SET profiling = 1;
2.运行一条SQL语句
SELECT * FROM tableName;
--查看 Profiles
SHOW PROFILES;
上面查看到 Query_ID 为9,那么,通过Profiling再查看 Query_ID为3的这条SQL运行的详细数据。
SHOW PROFILE block io,cpu,ipc,memory FOR QUERY 9;
ok. 一条简单的SQL语句MySQL内部进行了 15次操作,
show profile额外一些命令:
ALL | 显示所有的开销信息 |
BLOCK IO (阻塞IO) | 显示阻塞输入和输出的操作次数 |
CPU | 显示用户CPU时间、系统CPU时间 |
CONTEXT SWITCHES(上下文切换) | 显示上下文切换的次数 |
IPC 过程间通信 | 显示消息发送和接收的次数 (Internet Process Connection) |
MEMORY (内存) | 当前没有实现 |
PAGE FAULTS (页面错误) | 显示主要和次要的页面错误 |
SOURCE (源) | 从源代码显示函数的名字,连同文件的名称和行号及功能 |
SWAPS (交换) | 显示交换数 |
语法如下:
SHOW PROFILE [type [, type] ... ]
[FOR QUERY n]
[LIMIT row_count [OFFSET offset]]
type:
ALL:显示所有的开销信息
| BLOCK IO:显示块IO相关开销
| CONTEXT SWITCHES:上下文切换相关开销
| CPU:显示用户CPU时间、系统CPU时间
| IPC:显示发送和接收相关开销信息
| MEMORY:目前没有实现
| PAGE FAULTS:显示页面错误相关开销信息
| SOURCE:显示和Source_function,Source_file,Source_line相关的开销信息
| SWAPS:显示交换次数相关开销的信息
关于 MySQL 的 Query cache 参考:
http://www.ttlsa.com/mysql/disable-mysql-query-cache/