您的位置:首页 > 数据库 > MySQL

Mysql 执行计划分析

2016-06-02 15:36 645 查看
zjdev 正常访问;

mysql> explain SELECT temp.* ,
-> (SELECT COUNT(sn) FROM AssignClientManager WHERE FIND_IN_SET(clientManagerSn,temp.managerSnlist)>0) clientAccount,
-> (SELECT
->     IFNULL(SUM(capitalBalance), 0) + IFNULL(SUM(yieldBalance), 0)
-> FROM
->     ProductRepayment pr ,ProductRepay p
-> WHERE
->     pr.productSn = p.productSn AND
->     pr.clientSn IN (SELECT clientSn FROM AssignClientManager WHERE FIND_IN_SET(clientManagerSn,temp.managerSnlist)>0 )
->     AND pr.status = 1 AND DATEDIFF(p.realValueEndDate,CURDATE()) <=7 AND DATEDIFF(p.realValueEndDate,CURDATE())>=0
->     ) investBalance,
-> (SELECT
->     IFNULL(SUM(capitalBalance), 0) + IFNULL(SUM(yieldBalance), 0) + temp.availableBalance + temp.frozenWithDraw + temp.frozenPay
-> FROM
->     ProductRepayment
-> WHERE
->     clientSn = temp.sn IN (SELECT clientSn FROM AssignClientManager WHERE FIND_IN_SET(clientManagerSn,temp.managerSnlist)>0 )
->     AND STATUS = 1) totalBalance,
-> (SELECT
->     IFNULL(SUM(capitalBalance), 0) + IFNULL(SUM(yieldBalance), 0)
-> FROM
->     ProductRepayment pr
-> WHERE
->     pr.clientSn IN (SELECT clientSn FROM AssignClientManager WHERE FIND_IN_SET(clientManagerSn,temp.managerSnlist)>0 ) AND pr.status =1
->     ) unclearedBalance
-> FROM(
-> SELECT c.sn,cm.`parent`,c.`mobilePhone`,c.`userNick`,cp.`personName`,loadTreeByParent(cm.sn) AS managerSnlist,
-> cai.`availableBalance`,cai.`frozenWithDraw`,cai.`frozenPay`
-> FROM `Client` c
-> LEFT JOIN ClientManager cm ON c.`sn` = cm.`sn`
-> LEFT JOIN ClientPersonalInfo cp ON cp.`clientSn` = c.`sn`
-> LEFT JOIN ClientAssetInfo cai ON cai.`clientSn` = c.`sn`
-> WHERE cm.parent = 1496 ) temp
-> ;
+----+--------------------+---------------------+--------+---------------+---------+---------+-------------------+------+-------------------------------------------------------------------+
| id | select_type        | table               | type   | possible_keys | key     | key_len | ref               | rows | Extra                                                             |
+----+--------------------+---------------------+--------+---------------+---------+---------+-------------------+------+-------------------------------------------------------------------+
|  1 | PRIMARY            | <derived9>          | ALL    | NULL          | NULL    | NULL    | NULL              |   56 | NULL                                                              |
|  9 | DERIVED            | cm                  | ALL    | PRIMARY       | NULL    | NULL    | NULL              |   56 | Using where                                                       |
|  9 | DERIVED            | c                   | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.cm.sn        |    1 | NULL                                                              |
|  9 | DERIVED            | cp                  | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.cm.sn        |    1 | NULL                                                              |
|  9 | DERIVED            | cai                 | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.cm.sn        |    1 | NULL                                                              |
|  7 | DEPENDENT SUBQUERY | AssignClientManager | ALL    | NULL          | NULL    | NULL    | NULL              | 2126 | Using where; Start temporary                                      |
|  7 | DEPENDENT SUBQUERY | pr                  | ALL    | NULL          | NULL    | NULL    | NULL              | 5699 | Using where; End temporary; Using join buffer (Block Nested Loop) |
|  5 | DEPENDENT SUBQUERY | ProductRepayment    | ALL    | NULL          | NULL    | NULL    | NULL              | 5699 | Using where                                                       |
|  6 | DEPENDENT SUBQUERY | AssignClientManager | ALL    | NULL          | NULL    | NULL    | NULL              | 2126 | Using where                                                       |
|  3 | DEPENDENT SUBQUERY | pr                  | ALL    | NULL          | NULL    | NULL    | NULL              | 5699 | Using where                                                       |
|  3 | DEPENDENT SUBQUERY | p                   | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.pr.productSn |    1 | Using where                                                       |
|  3 | DEPENDENT SUBQUERY | AssignClientManager | ALL    | NULL          | NULL    | NULL    | NULL              | 2126 | Using where; FirstMatch(p); Using join buffer (Block Nested Loop) |
|  2 | DEPENDENT SUBQUERY | AssignClientManager | ALL    | NULL          | NULL    | NULL    | NULL              | 2126 | Using where                                                       |
+----+--------------------+---------------------+--------+---------------+---------+---------+-------------------+------+-------------------------------------------------------------------+
13 rows in set (0.00 sec)

mysql select_type :

<derived9>   派生表

DERIVED:被驱动的SELECT子查询(子查询位于FROM子句)

DEPENDENT SUBQUERY:子查询中首个SELECT,但依赖于外层的表(如果有多个子查询存在)

+----+--------------------+---------------------+------------+--------+---------------+---------+---------+-------------------+------+----------+--------------------------------------------------------------------+
| id | select_type        | table               | partitions | type   | possible_keys | key     | key_len | ref               | rows | filtered | Extra                                                              |
+----+--------------------+---------------------+------------+--------+---------------+---------+---------+-------------------+------+----------+--------------------------------------------------------------------+
|  1 | PRIMARY            | cm                  | NULL       | ALL    | PRIMARY       | NULL    | NULL    | NULL              |   92 |    10.00 | Using where                                                        |
|  1 | PRIMARY            | c                   | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.cm.sn        |    1 |   100.00 | NULL                                                               |
|  1 | PRIMARY            | cp                  | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.cm.sn        |    1 |   100.00 | NULL                                                               |
|  1 | PRIMARY            | cai                 | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.cm.sn        |    1 |   100.00 | NULL                                                               |
|  7 | DEPENDENT SUBQUERY | pr                  | NULL       | ALL    | NULL          | NULL    | NULL    | NULL              | 7559 |    10.00 | Using where                                                        |
|  7 | DEPENDENT SUBQUERY | AssignClientManager | NULL       | ALL    | NULL          | NULL    | NULL    | NULL              | 2817 |    10.00 | Using where; FirstMatch(pr); Using join buffer (Block Nested Loop) |
|  5 | DEPENDENT SUBQUERY | ProductRepayment    | NULL       | ALL    | NULL          | NULL    | NULL    | NULL              | 7559 |     1.00 | Using where                                                        |
|  6 | DEPENDENT SUBQUERY | AssignClientManager | NULL       | ALL    | NULL          | NULL    | NULL    | NULL              | 2817 |    10.00 | Using where                                                        |
|  3 | DEPENDENT SUBQUERY | pr                  | NULL       | ALL    | NULL          | NULL    | NULL    | NULL              | 7559 |    10.00 | Using where                                                        |
|  3 | DEPENDENT SUBQUERY | p                   | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.pr.productSn |    1 |   100.00 | Using where                                                        |
|  3 | DEPENDENT SUBQUERY | AssignClientManager | NULL       | ALL    | NULL          | NULL    | NULL    | NULL              | 2817 |    10.00 | Using where; FirstMatch(p); Using join buffer (Block Nested Loop)  |
|  2 | DEPENDENT SUBQUERY | AssignClientManager | NULL       | ALL    | NULL          | NULL    | NULL    | NULL              | 2817 |   100.00 | Using where                                                        |
+----+--------------------+---------------------+------------+--------+---------------+---------+---------+-------------------+------+----------+--------------------------------------------------------------------+

mysql> explain SELECT temp.* ,
-> (SELECT COUNT(sn) FROM AssignClientManager WHERE FIND_IN_SET(clientManagerSn,temp.managerSnlist)>0) clientAccount
->
->
-> FROM (
->   SELECT c.sn,cm.`parent`,c.`mobilePhone`,c.`userNick`,cp.`personName`,loadTreeByParent(cm.sn) AS managerSnlist,
->   cai.`availableBalance`,cai.`frozenWithDraw`,cai.`frozenPay`
->   FROM `Client` c
->   LEFT JOIN ClientManager cm ON c.`sn` = cm.`sn`
->   LEFT JOIN ClientPersonalInfo cp ON cp.`clientSn` = c.`sn`
->   LEFT JOIN ClientAssetInfo cai ON cai.`clientSn` = c.`sn`
->   WHERE cm.parent = 1496 ) temp
->   ;
+----+--------------------+---------------------+------------+--------+---------------+---------+---------+------------+------+----------+-------------+
| id | select_type        | table               | partitions | type   | possible_keys | key     | key_len | ref        | rows | filtered | Extra       |
+----+--------------------+---------------------+------------+--------+---------------+---------+---------+------------+------+----------+-------------+
|  1 | PRIMARY            | cm                  | NULL       | ALL    | PRIMARY       | NULL    | NULL    | NULL       |   92 |    10.00 | Using where |
|  1 | PRIMARY            | c                   | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.cm.sn |    1 |   100.00 | NULL        |
|  1 | PRIMARY            | cp                  | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.cm.sn |    1 |   100.00 | NULL        |
|  1 | PRIMARY            | cai                 | NULL       | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.cm.sn |    1 |   100.00 | NULL        |
|  2 | DEPENDENT SUBQUERY | AssignClientManager | NULL       | ALL    | NULL          | NULL    | NULL    | NULL       | 2817 |   100.00 | Using where |
+----+--------------------+---------------------+------------+--------+---------------+---------+---------+------------+------+----------+-------------+
5 rows in set, 2 warnings (0.02 sec)

DEPENDENT SUBQUERY | AssignClientManager 表示依赖子查询

所以这里是1驱动2

type   ALL
全表扫描,MySQL 从头到尾扫描整张表查找行。

mysql> explain SELECT temp.* ,
-> (SELECT COUNT(sn) FROM AssignClientManager WHERE FIND_IN_SET(clientManagerSn,temp.managerSnlist)>0) clientAccount
->
->
-> FROM (
->   SELECT c.sn,cm.`parent`,c.`mobilePhone`,c.`userNick`,cp.`personName`,loadTreeByParent(cm.sn) AS managerSnlist,
->   cai.`availableBalance`,cai.`frozenWithDraw`,cai.`frozenPay`
->   FROM `Client` c
->   LEFT JOIN ClientManager cm ON c.`sn` = cm.`sn`
->   LEFT JOIN ClientPersonalInfo cp ON cp.`clientSn` = c.`sn`
->   LEFT JOIN ClientAssetInfo cai ON cai.`clientSn` = c.`sn`
->   WHERE cm.parent = 1496 ) temp
->   ;
+----+--------------------+---------------------+--------+---------------+---------+---------+------------+------+-------------+
| id | select_type        | table               | type   | possible_keys | key     | key_len | ref        | rows | Extra       |
+----+--------------------+---------------------+--------+---------------+---------+---------+------------+------+-------------+
|  1 | PRIMARY            | <derived3>          | ALL    | NULL          | NULL    | NULL    | NULL       |   56 | NULL        |
|  3 | DERIVED            | cm                  | ALL    | PRIMARY       | NULL    | NULL    | NULL       |   56 | Using where |
|  3 | DERIVED            | c                   | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.cm.sn |    1 | NULL        |
|  3 | DERIVED            | cp                  | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.cm.sn |    1 | NULL        |
|  3 | DERIVED            | cai                 | eq_ref | PRIMARY       | PRIMARY | 4       | zjzc.cm.sn |    1 | NULL        |
|  2 | DEPENDENT SUBQUERY | AssignClientManager | ALL    | NULL          | NULL    | NULL    | NULL       | 2126 | Using where |
+----+--------------------+---------------------+--------+---------------+---------+---------+------------+------+-------------+
6 rows in set (0.00 sec)

这里 DEPENDENT SUBQUERY | AssignClientManager  驱动表是3

id是一组数字,表示查询中执行select子句或操作表的顺序。

如果id相同,则执行顺序从上至下。

如果是子查询,id的序号会递增,id越大则优先级越高,越先会被执行。

id如果相同,则可以认为是一组,从上往下顺序执行,所有组中,id越高,优先级越高,越容易执行。

驱动表为ID=3 cm:

cm,c,cp cai执行出来的结果 再去驱动2

id为3 出来的结果
就是1

<derived3>  指向3 表示 是3产生的派生表

mysql>  explain SELECT COUNT(sn) FROM AssignClientManager where clientSn>5;
+----+-------------+---------------------+------------+------+---------------+------+---------+------+------+----------+-------------+
| id | select_type | table               | partitions | type | possible_keys | key  | key_len | ref  | rows | filtered | Extra       |
+----+-------------+---------------------+------------+------+---------------+------+---------+------+------+----------+-------------+
|  1 | SIMPLE      | AssignClientManager | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 2817 |    33.33 | Using where |
+----+-------------+---------------------+------------+------+---------------+------+---------+------+------+----------+-------------+

type   ALL
全表扫描,MySQL 从头到尾扫描整张表查找行。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: