苏眠月|MySQL优化:explain、show profile和show processlist

推荐学习

  • 春招指南之“性能调优”:MySQL+Tomcat+JVM , 还怕面试官的轰炸?
  • MySQL性能优化21个最佳实践 , 一个一个分解给你看 , 还怕搞不定?
  • 阿里P8MySQL , 基础/索引/锁/日志/调优都不误 , 一锅深扒端给你

苏眠月|MySQL优化:explain、show profile和show processlist前言要想优化SQL语句 , 首先得知道SQL语句有什么问题 , 哪里需要被优化 。 这样就需要一个SQL语句的监控与量度指标 , 本文讲述的explain和show profile就是这样两个量度SQL语句的命令 。
本文主要基于MySQL5.6讲解其用法 , 因为之后的MySQL版本会去掉show profile功能 。
SQL脚本本篇使用的表结构以及数据如下
/*Table structure for table `dept` */CREATE TABLE `dept` (`deptno` int(2) NOT NULL,`dname` varchar(15) DEFAULT NULL,`loc` varchar(15) DEFAULT NULL,PRIMARY KEY (`deptno`) USING BTREE,UNIQUE KEY `index_dept_dname` (`dname`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;/*Data for the table `dept` */insertinto `dept`(`deptno`,`dname`,`loc`) values (10,'ACCOUNTING','NewYork'),(20,'RESEARCH','Dallas'),(30,'SALES','Chicago'),(40,'OPERATIONS','Boston');/*Table structure for table `emp` */CREATE TABLE `emp` (`empno` int(4) NOT NULL,`ename` varchar(10) DEFAULT NULL,`job` varchar(10) DEFAULT NULL,`mgr` int(4) DEFAULT NULL,`hiredate` date DEFAULT NULL,`sal` decimal(7,0) DEFAULT NULL,`comm` decimal(7,0) DEFAULT NULL,`deptno` int(2) DEFAULT NULL,PRIMARY KEY (`empno`) USING BTREE,KEY `index_emp_ename` (`ename`),KEY `index_emp_deptno` (`deptno`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT;/*Data for the table `emp` */insertinto `emp`(`empno`,`ename`,`job`,`mgr`,`hiredate`,`sal`,`comm`,`deptno`) values (7369,'SMITH','CLERK',7902,'1980-12-17',800,NULL,20),(7499,'ALLEN','SALESMAN',7698,'1981-02-20',1600,300,30),(7521,'WARD','SALESMAN',7698,'1981-02-22',1250,500,30),(7566,'JONES','MANAGER',7839,'1981-04-02',2975,NULL,20),(7654,'MARTIN','SALESMAN',7698,'1981-09-28',1250,1400,30),(7698,'BLAKE','MANAGER',7839,'1981-05-01',2850,NULL,30),(7782,'CLARK','MANAGER',7839,'1981-06-09',2450,NULL,10),(7788,'SCOTT','ANALYST',7566,'1987-07-13',3000,NULL,20),(7839,'KING','PRESIDENT',NULL,'1981-11-17',5000,NULL,10),(7844,'TURNER','SALESMAN',7698,'1981-09-08',1500,0,30),(7876,'ADAMS','CLERK',7788,'1987-07-13',1100,NULL,20),(7900,'JAMES','CLERK',7698,'1981-12-03',950,NULL,30),(7902,'FORD','ANALYST',7566,'1981-12-03',3000,NULL,20),(7934,'MILLER','CLERK',7782,'1982-01-23',1300,NULL,10);ALTER TABLE emp ADD INDEX idx_emp_ename(`ename`);ALTER TABLE emp ADD INDEX idx_emp_deptno(`deptno`);使用explainexplain关键字用于获取SQL语句的执行计划 , 描述的是SQL将以何种方式去执行 , 用法非常简单 , 就是直接加在SQL之前 。
explain select * from emp执行结果
mysql> explain select * from emp;+----+-------------+-------+------+---------------+------+---------+------+------+-------+| id | select_type | table | type | possible_keys | key| key_len | ref| rows | Extra |+----+-------------+-------+------+---------------+------+---------+------+------+-------+|1 | SIMPLE| emp| ALL| NULL| NULL | NULL| NULL |14 | NULL|+----+-------------+-------+------+---------------+------+---------+------+------+-------+1 row in set (0.01 sec)


推荐阅读