MySQL的explain是各种执行计划选择的结果,如果想看整个执行计划以及对于多种索引方案之间是如何选择的?
MySQL5.6中支持这个功能,optimizer_trace
这个是mysql的参数,默认是关闭的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
mysql>
set
optimizer_trace=
"enabled=on"
;
Query OK, 0
rows
affected (0.00 sec)
mysql> show variables
like
'%optimizer_trace%'
;
+
------------------------------+----------------------------------------------------------------------------+
| Variable_name | Value |
+
------------------------------+----------------------------------------------------------------------------+
| optimizer_trace | enabled=
on
,one_line=
off
|
| optimizer_trace_features | greedy_search=
on
,range_optimizer=
on
,dynamic_range=
on
,repeated_subselect=
on
|
| optimizer_trace_limit | 1 |
| optimizer_trace_max_mem_size | 16384 |
| optimizer_trace_offset | -1 |
+
------------------------------+----------------------------------------------------------------------------+
5
rows
in
set
(0.00 sec)
|
具体这么使用呢?
需要设置如下:
1、开启optimizer_trace,默认是关闭的
1
|
SET
optimizer_trace=
"enabled=on"
;
|
2、设置optimizer_trace内存的大小
1
|
SET
OPTIMIZER_TRACE_MAX_MEM_SIZE=1000000
|
3、explain查询语句
1
2
3
4
5
6
7
8
9
10
11
12
13
|
mysql> explain
SELECT
*
FROM
atomuser
WHERE
`uid` =28778731
AND
ptype =
"photo"
LIMIT 0 , 1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table
: atomuser
type: ref
possible_keys: uid
key
: uid
key_len: 15
ref: const,const
rows
: 1
Extra: Using
index
condition
1 row
in
set
(0.01 sec)
|
4、查找对于的结果
1
|
mysql>
select
*
from
information_schema.optimizer_trace\G
|
这个表包括4个字段
1
2
3
4
5
6
7
8
9
|
mysql> show
create
table
information_schema.optimizer_trace\G
*************************** 1. row ***************************
Table
: OPTIMIZER_TRACE
Create
Table
:
CREATE
TEMPORARY
TABLE
`OPTIMIZER_TRACE` (
`QUERY` longtext
NOT
NULL
,
`TRACE` longtext
NOT
NULL
,
`MISSING_BYTES_BEYOND_MAX_MEM_SIZE`
int
(20)
NOT
NULL
DEFAULT
'0'
,
`INSUFFICIENT_PRIVILEGES` tinyint(1)
NOT
NULL
DEFAULT
'0'
) ENGINE=MyISAM
DEFAULT
CHARSET=utf8
|
主要看TRACE字段,是json串,json解析结果如下:
包括join_preparation,join_optimization,join_explain
join_preparation
1
|
"/* select#1 */ select `atomuser`.`id` AS `id`,`atomuser`.`uid` AS `uid`,`atomuser`.`ptype` AS `ptype`,`atomuser`.`regtime` AS `regtime` from `atomuser` where ((`atomuser`.`uid` = 28778731) and (`atomuser`.`ptype` = 'photo')) limit 0,1"
|
这个是使用extend看到的结果
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
mysql> explain extended
SELECT
*
FROM
atomuser
WHERE
`uid` =28778731
AND
ptype =
"photo"
LIMIT 0 , 1\G
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table
: atomuser
type: ref
possible_keys: uid
key
: uid
key_len: 15
ref: const,const
rows
: 1
filtered: 100.00
Extra: Using
index
condition
1 row
in
set
, 1 warning (0.01 sec)
mysql> show warnings\G
*************************** 1. row ***************************
Level
: Note
Code: 1003
Message:
/* select#1 */
select
`test`.`atomuser`.`id`
AS
`id`,`test`.`atomuser`.`uid`
AS
`uid`,`test`.`atomuser`.`ptype`
AS
`ptype`,`test`.`atomuser`.`regtime`
AS
`regtime`
from
`test`.`atomuser`
where
((`test`.`atomuser`.`ptype` =
'photo'
)
and
(`test`.`atomuser`.`uid` = 28778731)) limit 0,1
1 row
in
set
(0.00 sec)
|