提交 ceaf5881 编写于 作者: martianzhang's avatar martianzhang

explain add test cases

  go test -update ./...
上级 77a48f16
...@@ -83,3 +83,5 @@ SELECT DATE_FORMAT(t.last_update, '%Y-%m-%d'), COUNT(DISTINCT (t.city)) FROM cit ...@@ -83,3 +83,5 @@ SELECT DATE_FORMAT(t.last_update, '%Y-%m-%d'), COUNT(DISTINCT (t.city)) FROM cit
create table hello.t (id int unsigned); create table hello.t (id int unsigned);
select * from tb where data >= ''; select * from tb where data >= '';
alter table tb alter column id drop default; alter table tb alter column id drop default;
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film where last_update > '2016-03-27 02:01:01') as d;
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film) as d;
...@@ -168,3 +168,7 @@ select * from tb where data >= ''; ...@@ -168,3 +168,7 @@ select * from tb where data >= '';
select * from tb where data >= ''; select * from tb where data >= '';
alter table tb alter column id drop default; alter table tb alter column id drop default;
alter table tb alter column id drop default; alter table tb alter column id drop default;
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film where last_update > '2016-03-27 02:01:01') as d;
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film where last_update > '2016-03-27 02:01:01') as d;
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film) as d;
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film) as d;
...@@ -880,3 +880,26 @@ ALTER TABLE ...@@ -880,3 +880,26 @@ ALTER TABLE
tb alter column id tb alter column id
DROP DROP
DEFAULT; DEFAULT;
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film where last_update > '2016-03-27 02:01:01') as d;
SELECT
maxId, minId
FROM
(
SELECT
MAX( film_id) maxId, MIN( film_id) minId
FROM
film
WHERE
last_update > '2016-03-27 02:01:01'
) as d;
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film) as d;
SELECT
maxId, minId
FROM
(
SELECT
MAX( film_id) maxId, MIN( film_id) minId
FROM
film) as d;
...@@ -1524,4 +1524,27 @@ ALTER TABLE ...@@ -1524,4 +1524,27 @@ ALTER TABLE
tb alter column id tb alter column id
DROP DROP
DEFAULT; DEFAULT;
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film where last_update > '2016-03-27 02:01:01') as d;
SELECT
maxId, minId
FROM
(
SELECT
MAX( film_id) maxId, MIN( film_id) minId
FROM
film
WHERE
last_update > '2016-03-27 02:01:01'
) as d;
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film) as d;
SELECT
maxId, minId
FROM
(
SELECT
MAX( film_id) maxId, MIN( film_id) minId
FROM
film) as d;
select 1 select 1
...@@ -88,3 +88,5 @@ SELECT ...@@ -88,3 +88,5 @@ SELECT
CREATE CREATE
SELECT SELECT
ALTER ALTER
SELECT
SELECT
...@@ -190,3 +190,7 @@ select * from tb where data >= ''; ...@@ -190,3 +190,7 @@ select * from tb where data >= '';
[`sakila`.`tb`] [`sakila`.`tb`]
alter table tb alter column id drop default; alter table tb alter column id drop default;
[`sakila`.tb`] [`sakila`.tb`]
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film where last_update > '2016-03-27 02:01:01') as d;
[`sakila`.`film`]
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film) as d;
[`sakila`.`film`]
...@@ -168,3 +168,7 @@ select * from tb where data >= ''; ...@@ -168,3 +168,7 @@ select * from tb where data >= '';
[{5 SELECT 0} {7 * 0} {0 0} {5 FROM 0} {1 tb 0} {5 WHERE 0} {1 data 0} {7 >= 0} {0 0} {2 '' 0} {7 ; 0}] [{5 SELECT 0} {7 * 0} {0 0} {5 FROM 0} {1 tb 0} {5 WHERE 0} {1 data 0} {7 >= 0} {0 0} {2 '' 0} {7 ; 0}]
alter table tb alter column id drop default; alter table tb alter column id drop default;
[{5 ALTER TABLE 0} {1 tb 0} {1 alter 0} {1 column 0} {1 id 0} {5 DROP 0} {4 DEFAULT; 0}] [{5 ALTER TABLE 0} {1 tb 0} {1 alter 0} {1 column 0} {1 id 0} {5 DROP 0} {4 DEFAULT; 0}]
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film where last_update > '2016-03-27 02:01:01') as d;
[{5 SELECT 0} {1 maxId, 0} {0 0} {1 minId 0} {5 FROM 0} {7 ( 0} {5 SELECT 0} {4 MAX( 0} {1 film_id) 0} {0 0} {1 maxId, 0} {0 0} {4 MIN( 0} {1 film_id) 0} {0 0} {1 minId 0} {5 FROM 0} {1 film 0} {5 WHERE 0} {1 last_update 0} {7 > 0} {0 0} {2 '2016-03-27 02:01:01' 0} {7 ) 0} {0 0} {1 as 0} {1 d; 0}]
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film) as d;
[{5 SELECT 0} {1 maxId, 0} {0 0} {1 minId 0} {5 FROM 0} {7 ( 0} {5 SELECT 0} {4 MAX( 0} {1 film_id) 0} {0 0} {1 maxId, 0} {0 0} {4 MIN( 0} {1 film_id) 0} {0 0} {1 minId 0} {5 FROM 0} {1 film) 0} {0 0} {1 as 0} {1 d; 0}]
...@@ -210,7 +210,7 @@ ...@@ -210,7 +210,7 @@
} }
[]ast.Token{ []ast.Token{
{Type:57348, Val:"select", i:0}, {Type:57348, Val:"select", i:0},
{Type:57592, Val:"sql_calc_found_rows", i:0}, {Type:57593, Val:"sql_calc_found_rows", i:0},
{Type:57396, Val:"col", i:0}, {Type:57396, Val:"col", i:0},
{Type:57353, Val:"from", i:0}, {Type:57353, Val:"from", i:0},
{Type:57396, Val:"tbl", i:0}, {Type:57396, Val:"tbl", i:0},
......
...@@ -205,5 +205,9 @@ func init() { ...@@ -205,5 +205,9 @@ func init() {
// https://github.com/XiaoMi/soar/issues/163 // https://github.com/XiaoMi/soar/issues/163
"alter table tb alter column id drop default;", "alter table tb alter column id drop default;",
// explain extra info "Select tables optimized away"
"select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film where last_update > '2016-03-27 02:01:01') as d;",
"select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film) as d;",
} }
} }
char(10) geostd8 10
char(256) geostd8 255
binary(10) geostd8 10
binary(256) geostd8 255
varchar(10) geostd8 11
varbinary(10) geostd8 11
enum('G','PG','PG-13','R','NC-17') geostd8 1
set('one', 'two') geostd8 1
not_exist geostd8 0
char(-1) geostd8 0
char(10) hebrew 10 char(10) hebrew 10
char(256) hebrew 255 char(256) hebrew 255
binary(10) hebrew 10 binary(10) hebrew 10
...@@ -8,26 +18,16 @@ enum('G','PG','PG-13','R','NC-17') hebrew 1 ...@@ -8,26 +18,16 @@ enum('G','PG','PG-13','R','NC-17') hebrew 1
set('one', 'two') hebrew 1 set('one', 'two') hebrew 1
not_exist hebrew 0 not_exist hebrew 0
char(-1) hebrew 0 char(-1) hebrew 0
char(10) latin2 10 char(10) hp8 10
char(256) latin2 255 char(256) hp8 255
binary(10) latin2 10 binary(10) hp8 10
binary(256) latin2 255 binary(256) hp8 255
varchar(10) latin2 11 varchar(10) hp8 11
varbinary(10) latin2 11 varbinary(10) hp8 11
enum('G','PG','PG-13','R','NC-17') latin2 1 enum('G','PG','PG-13','R','NC-17') hp8 1
set('one', 'two') latin2 1 set('one', 'two') hp8 1
not_exist latin2 0 not_exist hp8 0
char(-1) latin2 0 char(-1) hp8 0
char(10) big5 20
char(256) big5 510
binary(10) big5 10
binary(256) big5 255
varchar(10) big5 21
varbinary(10) big5 21
enum('G','PG','PG-13','R','NC-17') big5 1
set('one', 'two') big5 1
not_exist big5 0
char(-1) big5 0
char(10) cp1250 10 char(10) cp1250 10
char(256) cp1250 255 char(256) cp1250 255
binary(10) cp1250 10 binary(10) cp1250 10
...@@ -38,6 +38,26 @@ enum('G','PG','PG-13','R','NC-17') cp1250 1 ...@@ -38,6 +38,26 @@ enum('G','PG','PG-13','R','NC-17') cp1250 1
set('one', 'two') cp1250 1 set('one', 'two') cp1250 1
not_exist cp1250 0 not_exist cp1250 0
char(-1) cp1250 0 char(-1) cp1250 0
char(10) cp1257 10
char(256) cp1257 255
binary(10) cp1257 10
binary(256) cp1257 255
varchar(10) cp1257 11
varbinary(10) cp1257 11
enum('G','PG','PG-13','R','NC-17') cp1257 1
set('one', 'two') cp1257 1
not_exist cp1257 0
char(-1) cp1257 0
char(10) cp932 20
char(256) cp932 510
binary(10) cp932 10
binary(256) cp932 255
varchar(10) cp932 21
varbinary(10) cp932 21
enum('G','PG','PG-13','R','NC-17') cp932 1
set('one', 'two') cp932 1
not_exist cp932 0
char(-1) cp932 0
char(10) eucjpms 30 char(10) eucjpms 30
char(256) eucjpms 765 char(256) eucjpms 765
binary(10) eucjpms 10 binary(10) eucjpms 10
...@@ -48,6 +68,86 @@ enum('G','PG','PG-13','R','NC-17') eucjpms 1 ...@@ -48,6 +68,86 @@ enum('G','PG','PG-13','R','NC-17') eucjpms 1
set('one', 'two') eucjpms 1 set('one', 'two') eucjpms 1
not_exist eucjpms 0 not_exist eucjpms 0
char(-1) eucjpms 0 char(-1) eucjpms 0
char(10) euckr 20
char(256) euckr 510
binary(10) euckr 10
binary(256) euckr 255
varchar(10) euckr 21
varbinary(10) euckr 21
enum('G','PG','PG-13','R','NC-17') euckr 1
set('one', 'two') euckr 1
not_exist euckr 0
char(-1) euckr 0
char(10) macroman 10
char(256) macroman 255
binary(10) macroman 10
binary(256) macroman 255
varchar(10) macroman 11
varbinary(10) macroman 11
enum('G','PG','PG-13','R','NC-17') macroman 1
set('one', 'two') macroman 1
not_exist macroman 0
char(-1) macroman 0
char(10) ucs2 20
char(256) ucs2 510
binary(10) ucs2 10
binary(256) ucs2 255
varchar(10) ucs2 21
varbinary(10) ucs2 21
enum('G','PG','PG-13','R','NC-17') ucs2 1
set('one', 'two') ucs2 1
not_exist ucs2 0
char(-1) ucs2 0
char(10) utf32 40
char(256) utf32 1020
binary(10) utf32 10
binary(256) utf32 255
varchar(10) utf32 41
varbinary(10) utf32 41
enum('G','PG','PG-13','R','NC-17') utf32 1
set('one', 'two') utf32 1
not_exist utf32 0
char(-1) utf32 0
char(10) utf8 30
char(256) utf8 765
binary(10) utf8 10
binary(256) utf8 255
varchar(10) utf8 31
varbinary(10) utf8 31
enum('G','PG','PG-13','R','NC-17') utf8 1
set('one', 'two') utf8 1
not_exist utf8 0
char(-1) utf8 0
char(10) gb18030 40
char(256) gb18030 1020
binary(10) gb18030 10
binary(256) gb18030 255
varchar(10) gb18030 41
varbinary(10) gb18030 41
enum('G','PG','PG-13','R','NC-17') gb18030 1
set('one', 'two') gb18030 1
not_exist gb18030 0
char(-1) gb18030 0
char(10) koi8r 10
char(256) koi8r 255
binary(10) koi8r 10
binary(256) koi8r 255
varchar(10) koi8r 11
varbinary(10) koi8r 11
enum('G','PG','PG-13','R','NC-17') koi8r 1
set('one', 'two') koi8r 1
not_exist koi8r 0
char(-1) koi8r 0
char(10) koi8u 10
char(256) koi8u 255
binary(10) koi8u 10
binary(256) koi8u 255
varchar(10) koi8u 11
varbinary(10) koi8u 11
enum('G','PG','PG-13','R','NC-17') koi8u 1
set('one', 'two') koi8u 1
not_exist koi8u 0
char(-1) koi8u 0
char(10) latin1 10 char(10) latin1 10
char(256) latin1 255 char(256) latin1 255
binary(10) latin1 10 binary(10) latin1 10
...@@ -58,6 +158,36 @@ enum('G','PG','PG-13','R','NC-17') latin1 1 ...@@ -58,6 +158,36 @@ enum('G','PG','PG-13','R','NC-17') latin1 1
set('one', 'two') latin1 1 set('one', 'two') latin1 1
not_exist latin1 0 not_exist latin1 0
char(-1) latin1 0 char(-1) latin1 0
char(10) swe7 10
char(256) swe7 255
binary(10) swe7 10
binary(256) swe7 255
varchar(10) swe7 11
varbinary(10) swe7 11
enum('G','PG','PG-13','R','NC-17') swe7 1
set('one', 'two') swe7 1
not_exist swe7 0
char(-1) swe7 0
char(10) binary 10
char(256) binary 255
binary(10) binary 10
binary(256) binary 255
varchar(10) binary 11
varbinary(10) binary 11
enum('G','PG','PG-13','R','NC-17') binary 1
set('one', 'two') binary 1
not_exist binary 0
char(-1) binary 0
char(10) keybcs2 10
char(256) keybcs2 255
binary(10) keybcs2 10
binary(256) keybcs2 255
varchar(10) keybcs2 11
varbinary(10) keybcs2 11
enum('G','PG','PG-13','R','NC-17') keybcs2 1
set('one', 'two') keybcs2 1
not_exist keybcs2 0
char(-1) keybcs2 0
char(10) macce 10 char(10) macce 10
char(256) macce 255 char(256) macce 255
binary(10) macce 10 binary(10) macce 10
...@@ -68,26 +198,16 @@ enum('G','PG','PG-13','R','NC-17') macce 1 ...@@ -68,26 +198,16 @@ enum('G','PG','PG-13','R','NC-17') macce 1
set('one', 'two') macce 1 set('one', 'two') macce 1
not_exist macce 0 not_exist macce 0
char(-1) macce 0 char(-1) macce 0
char(10) tis620 10 char(10) ujis 30
char(256) tis620 255 char(256) ujis 765
binary(10) tis620 10 binary(10) ujis 10
binary(256) tis620 255 binary(256) ujis 255
varchar(10) tis620 11 varchar(10) ujis 31
varbinary(10) tis620 11 varbinary(10) ujis 31
enum('G','PG','PG-13','R','NC-17') tis620 1 enum('G','PG','PG-13','R','NC-17') ujis 1
set('one', 'two') tis620 1 set('one', 'two') ujis 1
not_exist tis620 0 not_exist ujis 0
char(-1) tis620 0 char(-1) ujis 0
char(10) utf16 40
char(256) utf16 1020
binary(10) utf16 10
binary(256) utf16 255
varchar(10) utf16 41
varbinary(10) utf16 41
enum('G','PG','PG-13','R','NC-17') utf16 1
set('one', 'two') utf16 1
not_exist utf16 0
char(-1) utf16 0
char(10) utf16le 40 char(10) utf16le 40
char(256) utf16le 1020 char(256) utf16le 1020
binary(10) utf16le 10 binary(10) utf16le 10
...@@ -98,36 +218,26 @@ enum('G','PG','PG-13','R','NC-17') utf16le 1 ...@@ -98,36 +218,26 @@ enum('G','PG','PG-13','R','NC-17') utf16le 1
set('one', 'two') utf16le 1 set('one', 'two') utf16le 1
not_exist utf16le 0 not_exist utf16le 0
char(-1) utf16le 0 char(-1) utf16le 0
char(10) binary 10 char(10) cp1256 10
char(256) binary 255 char(256) cp1256 255
binary(10) binary 10 binary(10) cp1256 10
binary(256) binary 255 binary(256) cp1256 255
varchar(10) binary 11 varchar(10) cp1256 11
varbinary(10) binary 11 varbinary(10) cp1256 11
enum('G','PG','PG-13','R','NC-17') binary 1 enum('G','PG','PG-13','R','NC-17') cp1256 1
set('one', 'two') binary 1 set('one', 'two') cp1256 1
not_exist binary 0 not_exist cp1256 0
char(-1) binary 0 char(-1) cp1256 0
char(10) cp852 10 char(10) gb2312 20
char(256) cp852 255 char(256) gb2312 510
binary(10) cp852 10 binary(10) gb2312 10
binary(256) cp852 255 binary(256) gb2312 255
varchar(10) cp852 11 varchar(10) gb2312 21
varbinary(10) cp852 11 varbinary(10) gb2312 21
enum('G','PG','PG-13','R','NC-17') cp852 1 enum('G','PG','PG-13','R','NC-17') gb2312 1
set('one', 'two') cp852 1 set('one', 'two') gb2312 1
not_exist cp852 0 not_exist gb2312 0
char(-1) cp852 0 char(-1) gb2312 0
char(10) cp932 20
char(256) cp932 510
binary(10) cp932 10
binary(256) cp932 255
varchar(10) cp932 21
varbinary(10) cp932 21
enum('G','PG','PG-13','R','NC-17') cp932 1
set('one', 'two') cp932 1
not_exist cp932 0
char(-1) cp932 0
char(10) gbk 20 char(10) gbk 20
char(256) gbk 510 char(256) gbk 510
binary(10) gbk 10 binary(10) gbk 10
...@@ -138,76 +248,6 @@ enum('G','PG','PG-13','R','NC-17') gbk 1 ...@@ -138,76 +248,6 @@ enum('G','PG','PG-13','R','NC-17') gbk 1
set('one', 'two') gbk 1 set('one', 'two') gbk 1
not_exist gbk 0 not_exist gbk 0
char(-1) gbk 0 char(-1) gbk 0
char(10) hp8 10
char(256) hp8 255
binary(10) hp8 10
binary(256) hp8 255
varchar(10) hp8 11
varbinary(10) hp8 11
enum('G','PG','PG-13','R','NC-17') hp8 1
set('one', 'two') hp8 1
not_exist hp8 0
char(-1) hp8 0
char(10) ucs2 20
char(256) ucs2 510
binary(10) ucs2 10
binary(256) ucs2 255
varchar(10) ucs2 21
varbinary(10) ucs2 21
enum('G','PG','PG-13','R','NC-17') ucs2 1
set('one', 'two') ucs2 1
not_exist ucs2 0
char(-1) ucs2 0
char(10) cp1251 10
char(256) cp1251 255
binary(10) cp1251 10
binary(256) cp1251 255
varchar(10) cp1251 11
varbinary(10) cp1251 11
enum('G','PG','PG-13','R','NC-17') cp1251 1
set('one', 'two') cp1251 1
not_exist cp1251 0
char(-1) cp1251 0
char(10) cp1256 10
char(256) cp1256 255
binary(10) cp1256 10
binary(256) cp1256 255
varchar(10) cp1256 11
varbinary(10) cp1256 11
enum('G','PG','PG-13','R','NC-17') cp1256 1
set('one', 'two') cp1256 1
not_exist cp1256 0
char(-1) cp1256 0
char(10) dec8 10
char(256) dec8 255
binary(10) dec8 10
binary(256) dec8 255
varchar(10) dec8 11
varbinary(10) dec8 11
enum('G','PG','PG-13','R','NC-17') dec8 1
set('one', 'two') dec8 1
not_exist dec8 0
char(-1) dec8 0
char(10) euckr 20
char(256) euckr 510
binary(10) euckr 10
binary(256) euckr 255
varchar(10) euckr 21
varbinary(10) euckr 21
enum('G','PG','PG-13','R','NC-17') euckr 1
set('one', 'two') euckr 1
not_exist euckr 0
char(-1) euckr 0
char(10) geostd8 10
char(256) geostd8 255
binary(10) geostd8 10
binary(256) geostd8 255
varchar(10) geostd8 11
varbinary(10) geostd8 11
enum('G','PG','PG-13','R','NC-17') geostd8 1
set('one', 'two') geostd8 1
not_exist geostd8 0
char(-1) geostd8 0
char(10) greek 10 char(10) greek 10
char(256) greek 255 char(256) greek 255
binary(10) greek 10 binary(10) greek 10
...@@ -218,26 +258,56 @@ enum('G','PG','PG-13','R','NC-17') greek 1 ...@@ -218,26 +258,56 @@ enum('G','PG','PG-13','R','NC-17') greek 1
set('one', 'two') greek 1 set('one', 'two') greek 1
not_exist greek 0 not_exist greek 0
char(-1) greek 0 char(-1) greek 0
char(10) macroman 10 char(10) big5 20
char(256) macroman 255 char(256) big5 510
binary(10) macroman 10 binary(10) big5 10
binary(256) macroman 255 binary(256) big5 255
varchar(10) macroman 11 varchar(10) big5 21
varbinary(10) macroman 11 varbinary(10) big5 21
enum('G','PG','PG-13','R','NC-17') macroman 1 enum('G','PG','PG-13','R','NC-17') big5 1
set('one', 'two') macroman 1 set('one', 'two') big5 1
not_exist macroman 0 not_exist big5 0
char(-1) macroman 0 char(-1) big5 0
char(10) armscii8 10 char(10) utf16 40
char(256) armscii8 255 char(256) utf16 1020
binary(10) armscii8 10 binary(10) utf16 10
binary(256) armscii8 255 binary(256) utf16 255
varchar(10) armscii8 11 varchar(10) utf16 41
varbinary(10) armscii8 11 varbinary(10) utf16 41
enum('G','PG','PG-13','R','NC-17') armscii8 1 enum('G','PG','PG-13','R','NC-17') utf16 1
set('one', 'two') armscii8 1 set('one', 'two') utf16 1
not_exist armscii8 0 not_exist utf16 0
char(-1) armscii8 0 char(-1) utf16 0
char(10) latin5 10
char(256) latin5 255
binary(10) latin5 10
binary(256) latin5 255
varchar(10) latin5 11
varbinary(10) latin5 11
enum('G','PG','PG-13','R','NC-17') latin5 1
set('one', 'two') latin5 1
not_exist latin5 0
char(-1) latin5 0
char(10) latin7 10
char(256) latin7 255
binary(10) latin7 10
binary(256) latin7 255
varchar(10) latin7 11
varbinary(10) latin7 11
enum('G','PG','PG-13','R','NC-17') latin7 1
set('one', 'two') latin7 1
not_exist latin7 0
char(-1) latin7 0
char(10) cp1251 10
char(256) cp1251 255
binary(10) cp1251 10
binary(256) cp1251 255
varchar(10) cp1251 11
varbinary(10) cp1251 11
enum('G','PG','PG-13','R','NC-17') cp1251 1
set('one', 'two') cp1251 1
not_exist cp1251 0
char(-1) cp1251 0
char(10) cp850 10 char(10) cp850 10
char(256) cp850 255 char(256) cp850 255
binary(10) cp850 10 binary(10) cp850 10
...@@ -248,36 +318,36 @@ enum('G','PG','PG-13','R','NC-17') cp850 1 ...@@ -248,36 +318,36 @@ enum('G','PG','PG-13','R','NC-17') cp850 1
set('one', 'two') cp850 1 set('one', 'two') cp850 1
not_exist cp850 0 not_exist cp850 0
char(-1) cp850 0 char(-1) cp850 0
char(10) koi8u 10 char(10) cp852 10
char(256) koi8u 255 char(256) cp852 255
binary(10) koi8u 10 binary(10) cp852 10
binary(256) koi8u 255 binary(256) cp852 255
varchar(10) koi8u 11 varchar(10) cp852 11
varbinary(10) koi8u 11 varbinary(10) cp852 11
enum('G','PG','PG-13','R','NC-17') koi8u 1 enum('G','PG','PG-13','R','NC-17') cp852 1
set('one', 'two') koi8u 1 set('one', 'two') cp852 1
not_exist koi8u 0 not_exist cp852 0
char(-1) koi8u 0 char(-1) cp852 0
char(10) ujis 30 char(10) dec8 10
char(256) ujis 765 char(256) dec8 255
binary(10) ujis 10 binary(10) dec8 10
binary(256) ujis 255 binary(256) dec8 255
varchar(10) ujis 31 varchar(10) dec8 11
varbinary(10) ujis 31 varbinary(10) dec8 11
enum('G','PG','PG-13','R','NC-17') ujis 1 enum('G','PG','PG-13','R','NC-17') dec8 1
set('one', 'two') ujis 1 set('one', 'two') dec8 1
not_exist ujis 0 not_exist dec8 0
char(-1) ujis 0 char(-1) dec8 0
char(10) utf32 40 char(10) latin2 10
char(256) utf32 1020 char(256) latin2 255
binary(10) utf32 10 binary(10) latin2 10
binary(256) utf32 255 binary(256) latin2 255
varchar(10) utf32 41 varchar(10) latin2 11
varbinary(10) utf32 41 varbinary(10) latin2 11
enum('G','PG','PG-13','R','NC-17') utf32 1 enum('G','PG','PG-13','R','NC-17') latin2 1
set('one', 'two') utf32 1 set('one', 'two') latin2 1
not_exist utf32 0 not_exist latin2 0
char(-1) utf32 0 char(-1) latin2 0
char(10) cp866 10 char(10) cp866 10
char(256) cp866 255 char(256) cp866 255
binary(10) cp866 10 binary(10) cp866 10
...@@ -288,36 +358,16 @@ enum('G','PG','PG-13','R','NC-17') cp866 1 ...@@ -288,36 +358,16 @@ enum('G','PG','PG-13','R','NC-17') cp866 1
set('one', 'two') cp866 1 set('one', 'two') cp866 1
not_exist cp866 0 not_exist cp866 0
char(-1) cp866 0 char(-1) cp866 0
char(10) gb2312 20 char(10) armscii8 10
char(256) gb2312 510 char(256) armscii8 255
binary(10) gb2312 10 binary(10) armscii8 10
binary(256) gb2312 255 binary(256) armscii8 255
varchar(10) gb2312 21 varchar(10) armscii8 11
varbinary(10) gb2312 21 varbinary(10) armscii8 11
enum('G','PG','PG-13','R','NC-17') gb2312 1 enum('G','PG','PG-13','R','NC-17') armscii8 1
set('one', 'two') gb2312 1 set('one', 'two') armscii8 1
not_exist gb2312 0 not_exist armscii8 0
char(-1) gb2312 0 char(-1) armscii8 0
char(10) swe7 10
char(256) swe7 255
binary(10) swe7 10
binary(256) swe7 255
varchar(10) swe7 11
varbinary(10) swe7 11
enum('G','PG','PG-13','R','NC-17') swe7 1
set('one', 'two') swe7 1
not_exist swe7 0
char(-1) swe7 0
char(10) utf8mb4 40
char(256) utf8mb4 1020
binary(10) utf8mb4 10
binary(256) utf8mb4 255
varchar(10) utf8mb4 41
varbinary(10) utf8mb4 41
enum('G','PG','PG-13','R','NC-17') utf8mb4 1
set('one', 'two') utf8mb4 1
not_exist utf8mb4 0
char(-1) utf8mb4 0
char(10) ascii 10 char(10) ascii 10
char(256) ascii 255 char(256) ascii 255
binary(10) ascii 10 binary(10) ascii 10
...@@ -328,36 +378,6 @@ enum('G','PG','PG-13','R','NC-17') ascii 1 ...@@ -328,36 +378,6 @@ enum('G','PG','PG-13','R','NC-17') ascii 1
set('one', 'two') ascii 1 set('one', 'two') ascii 1
not_exist ascii 0 not_exist ascii 0
char(-1) ascii 0 char(-1) ascii 0
char(10) latin5 10
char(256) latin5 255
binary(10) latin5 10
binary(256) latin5 255
varchar(10) latin5 11
varbinary(10) latin5 11
enum('G','PG','PG-13','R','NC-17') latin5 1
set('one', 'two') latin5 1
not_exist latin5 0
char(-1) latin5 0
char(10) koi8r 10
char(256) koi8r 255
binary(10) koi8r 10
binary(256) koi8r 255
varchar(10) koi8r 11
varbinary(10) koi8r 11
enum('G','PG','PG-13','R','NC-17') koi8r 1
set('one', 'two') koi8r 1
not_exist koi8r 0
char(-1) koi8r 0
char(10) latin7 10
char(256) latin7 255
binary(10) latin7 10
binary(256) latin7 255
varchar(10) latin7 11
varbinary(10) latin7 11
enum('G','PG','PG-13','R','NC-17') latin7 1
set('one', 'two') latin7 1
not_exist latin7 0
char(-1) latin7 0
char(10) sjis 20 char(10) sjis 20
char(256) sjis 510 char(256) sjis 510
binary(10) sjis 10 binary(10) sjis 10
...@@ -368,43 +388,23 @@ enum('G','PG','PG-13','R','NC-17') sjis 1 ...@@ -368,43 +388,23 @@ enum('G','PG','PG-13','R','NC-17') sjis 1
set('one', 'two') sjis 1 set('one', 'two') sjis 1
not_exist sjis 0 not_exist sjis 0
char(-1) sjis 0 char(-1) sjis 0
char(10) utf8 30 char(10) tis620 10
char(256) utf8 765 char(256) tis620 255
binary(10) utf8 10 binary(10) tis620 10
binary(256) utf8 255 binary(256) tis620 255
varchar(10) utf8 31 varchar(10) tis620 11
varbinary(10) utf8 31 varbinary(10) tis620 11
enum('G','PG','PG-13','R','NC-17') utf8 1 enum('G','PG','PG-13','R','NC-17') tis620 1
set('one', 'two') utf8 1 set('one', 'two') tis620 1
not_exist utf8 0 not_exist tis620 0
char(-1) utf8 0 char(-1) tis620 0
char(10) cp1257 10 char(10) utf8mb4 40
char(256) cp1257 255 char(256) utf8mb4 1020
binary(10) cp1257 10 binary(10) utf8mb4 10
binary(256) cp1257 255 binary(256) utf8mb4 255
varchar(10) cp1257 11 varchar(10) utf8mb4 41
varbinary(10) cp1257 11 varbinary(10) utf8mb4 41
enum('G','PG','PG-13','R','NC-17') cp1257 1 enum('G','PG','PG-13','R','NC-17') utf8mb4 1
set('one', 'two') cp1257 1 set('one', 'two') utf8mb4 1
not_exist cp1257 0 not_exist utf8mb4 0
char(-1) cp1257 0 char(-1) utf8mb4 0
char(10) gb18030 40
char(256) gb18030 1020
binary(10) gb18030 10
binary(256) gb18030 255
varchar(10) gb18030 41
varbinary(10) gb18030 41
enum('G','PG','PG-13','R','NC-17') gb18030 1
set('one', 'two') gb18030 1
not_exist gb18030 0
char(-1) gb18030 0
char(10) keybcs2 10
char(256) keybcs2 255
binary(10) keybcs2 10
binary(256) keybcs2 255
varchar(10) keybcs2 11
varbinary(10) keybcs2 11
enum('G','PG','PG-13','R','NC-17') keybcs2 1
set('one', 'two') keybcs2 1
not_exist keybcs2 0
char(-1) keybcs2 0
...@@ -378,6 +378,7 @@ var ExplainExtra = map[string]string{ ...@@ -378,6 +378,7 @@ var ExplainExtra = map[string]string{
"No tables used": "查询没有FROM子句, 或者有一个 FROM DUAL子句.", "No tables used": "查询没有FROM子句, 或者有一个 FROM DUAL子句.",
"Not exists": "MySQL能够对LEFT JOIN查询进行优化, 并且在查找到符合LEFT JOIN条件的行后, 则不再查找更多的行.", "Not exists": "MySQL能够对LEFT JOIN查询进行优化, 并且在查找到符合LEFT JOIN条件的行后, 则不再查找更多的行.",
"Plan isn't ready yet": "This value occurs with EXPLAIN FOR CONNECTION when the optimizer has not finished creating the execution plan for the statement executing in the named connection. If execution plan output comprises multiple lines, any or all of them could have this Extra value, depending on the progress of the optimizer in determining the full execution plan.", "Plan isn't ready yet": "This value occurs with EXPLAIN FOR CONNECTION when the optimizer has not finished creating the execution plan for the statement executing in the named connection. If execution plan output comprises multiple lines, any or all of them could have this Extra value, depending on the progress of the optimizer in determining the full execution plan.",
"Select tables optimized away": "仅通过使用索引,优化器可能仅从聚合函数结果中返回一行。如:在没有 GROUP BY 子句的情况下,基于索引优化 MIN/MAX 操作,或者对于 MyISAM 存储引擎优化 COUNT(*) 操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。",
"Using intersect": "开启了index merge,即:对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,使用的算法为:index_merge_intersection", "Using intersect": "开启了index merge,即:对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,使用的算法为:index_merge_intersection",
"Using union": "开启了index merge,即:对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,使用的算法为:index_merge_union", "Using union": "开启了index merge,即:对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,使用的算法为:index_merge_union",
"Using sort_union": "开启了index merge,即:对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,使用的算法为:index_merge_sort_union", "Using sort_union": "开启了index merge,即:对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,使用的算法为:index_merge_sort_union",
......
CREATE DATABASE `sakila` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ <nil> CREATE DATABASE `sakila` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ <nil>
...@@ -21,6 +21,3 @@ sales_by_store ...@@ -21,6 +21,3 @@ sales_by_store
staff staff
staff_list staff_list
store store
t_clinic_info
t_partition_list
test_id
...@@ -83,3 +83,5 @@ select date_format(t.last_update, ?), count(distinct (t.city)) from city t where ...@@ -83,3 +83,5 @@ select date_format(t.last_update, ?), count(distinct (t.city)) from city t where
create table hello.t (id int unsigned) create table hello.t (id int unsigned)
select * from tb where data >= ? select * from tb where data >= ?
alter table tb alter column id drop default alter table tb alter column id drop default
select maxid, minid from (select max(film_id) maxid, min(film_id) minid from film where last_update > ?) as d
select maxid, minid from (select max(film_id) maxid, min(film_id) minid from film) as d
...@@ -62,6 +62,8 @@ SELECT ID,name FROM (SELECT address FROM customer_list WHERE SID=1 order by phon ...@@ -62,6 +62,8 @@ SELECT ID,name FROM (SELECT address FROM customer_list WHERE SID=1 order by phon
SELECT language_id FROM film WHERE length = 123 GROUP BY release_year ORDER BY language_id SELECT language_id FROM film WHERE length = 123 GROUP BY release_year ORDER BY language_id
SELECT last_update FROM film GROUP BY date(last_update) SELECT last_update FROM film GROUP BY date(last_update)
SELECT last_update FROM film order by date(last_update) SELECT last_update FROM film order by date(last_update)
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film) as d
select maxId, minId from (select max(film_id) maxId, min(film_id) minId from film where last_update > '2016-03-27 02:01:01') as d
SELECT release_year FROM film WHERE length = 123 GROUP BY release_year ORDER BY release_year SELECT release_year FROM film WHERE length = 123 GROUP BY release_year ORDER BY release_year
SELECT release_year FROM film WHERE length = 123 GROUP BY release_year ORDER BY release_year LIMIT 10 SELECT release_year FROM film WHERE length = 123 GROUP BY release_year ORDER BY release_year LIMIT 10
SELECT release_year, language_id, sum(length) FROM film GROUP BY release_year, language_id SELECT release_year, language_id, sum(length) FROM film GROUP BY release_year, language_id
......
...@@ -83,3 +83,5 @@ SELECT DATE_FORMAT( t. last_update, '%Y-%m-%d' ), COUNT( DISTINCT ( t. city)) FR ...@@ -83,3 +83,5 @@ SELECT DATE_FORMAT( t. last_update, '%Y-%m-%d' ), COUNT( DISTINCT ( t. city)) FR
create table hello. t (id int unsigned); create table hello. t (id int unsigned);
SELECT * FROM tb WHERE data >= ''; SELECT * FROM tb WHERE data >= '';
ALTER TABLE tb alter column id DROP DEFAULT; ALTER TABLE tb alter column id DROP DEFAULT;
SELECT maxId, minId FROM ( SELECT MAX( film_id) maxId, MIN( film_id) minId FROM film WHERE last_update > '2016-03-27 02:01:01' ) as d;
SELECT maxId, minId FROM ( SELECT MAX( film_id) maxId, MIN( film_id) minId FROM film) as d;
...@@ -91,6 +91,9 @@ ...@@ -91,6 +91,9 @@
"`unknown`.`city`", "`unknown`.`city`",
"`unknown`.`country`" "`unknown`.`country`"
], ],
"4A39009B402BAD9B": [
"`unknown`.`film`"
],
"4E73AA068370E6A8": [ "4E73AA068370E6A8": [
"`unknown`.`film`" "`unknown`.`film`"
], ],
...@@ -190,6 +193,9 @@ ...@@ -190,6 +193,9 @@
"B3C502B4AA344196": [ "B3C502B4AA344196": [
"`unknown`.`film`" "`unknown`.`film`"
], ],
"B48292EDB9D0E010": [
"`unknown`.`film`"
],
"B862978586C6338B": [ "B862978586C6338B": [
"`unknown`.`city`", "`unknown`.`city`",
"`unknown`.`country`" "`unknown`.`country`"
...@@ -364,6 +370,9 @@ ...@@ -364,6 +370,9 @@
"`sakila`.`city`", "`sakila`.`city`",
"`sakila`.`country`" "`sakila`.`country`"
], ],
"4A39009B402BAD9B": [
"`sakila`.`film`"
],
"4E73AA068370E6A8": [ "4E73AA068370E6A8": [
"`sakila`.`film`" "`sakila`.`film`"
], ],
...@@ -463,6 +472,9 @@ ...@@ -463,6 +472,9 @@
"B3C502B4AA344196": [ "B3C502B4AA344196": [
"`sakila`.`film`" "`sakila`.`film`"
], ],
"B48292EDB9D0E010": [
"`sakila`.`film`"
],
"B862978586C6338B": [ "B862978586C6338B": [
"`sakila`.`city`", "`sakila`.`city`",
"`sakila`.`country`" "`sakila`.`country`"
......
...@@ -2503,3 +2503,86 @@ DROP ...@@ -2503,3 +2503,86 @@ DROP
## OK ## OK
# Query: B48292EDB9D0E010
★ ★ ☆ ☆ ☆ 50分
```sql
SELECT
maxId, minId
FROM
(
SELECT
MAX( film_id) maxId, MIN( film_id) minId
FROM
film
WHERE
last_update > '2016-03-27 02:01:01'
) as d
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## MySQL 对子查询的优化效果不佳
* **Item:** SUB.001
* **Severity:** L4
* **Content:** MySQL 将外部查询中的每一行作为依赖子查询执行子查询。 这是导致严重性能问题的常见原因。这可能会在 MySQL 5.6 版本中得到改善, 但对于5.1及更早版本, 建议将该类查询分别重写为 JOIN 或 LEFT OUTER JOIN。
## 不建议在子查询中使用函数
* **Item:** SUB.006
* **Severity:** L2
* **Content:** MySQL将外部查询中的每一行作为依赖子查询执行子查询,如果在子查询中使用函数,即使是semi-join也很难进行高效的查询。可以将子查询重写为OUTER JOIN语句并用连接条件对数据进行过滤。
# Query: 4A39009B402BAD9B
★ ★ ☆ ☆ ☆ 50分
```sql
SELECT
maxId, minId
FROM
(
SELECT
MAX( film_id) maxId, MIN( film_id) minId
FROM
film) as d
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## MySQL 对子查询的优化效果不佳
* **Item:** SUB.001
* **Severity:** L4
* **Content:** MySQL 将外部查询中的每一行作为依赖子查询执行子查询。 这是导致严重性能问题的常见原因。这可能会在 MySQL 5.6 版本中得到改善, 但对于5.1及更早版本, 建议将该类查询分别重写为 JOIN 或 LEFT OUTER JOIN。
## 不建议在子查询中使用函数
* **Item:** SUB.006
* **Severity:** L2
* **Content:** MySQL将外部查询中的每一行作为依赖子查询执行子查询,如果在子查询中使用函数,即使是semi-join也很难进行高效的查询。可以将子查询重写为OUTER JOIN语句并用连接条件对数据进行过滤。
...@@ -2503,3 +2503,86 @@ DROP ...@@ -2503,3 +2503,86 @@ DROP
## OK ## OK
# Query: B48292EDB9D0E010
★ ★ ☆ ☆ ☆ 50分
```sql
SELECT
maxId, minId
FROM
(
SELECT
MAX( film_id) maxId, MIN( film_id) minId
FROM
film
WHERE
last_update > '2016-03-27 02:01:01'
) as d
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## MySQL 对子查询的优化效果不佳
* **Item:** SUB.001
* **Severity:** L4
* **Content:** MySQL 将外部查询中的每一行作为依赖子查询执行子查询。 这是导致严重性能问题的常见原因。这可能会在 MySQL 5.6 版本中得到改善, 但对于5.1及更早版本, 建议将该类查询分别重写为 JOIN 或 LEFT OUTER JOIN。
## 不建议在子查询中使用函数
* **Item:** SUB.006
* **Severity:** L2
* **Content:** MySQL将外部查询中的每一行作为依赖子查询执行子查询,如果在子查询中使用函数,即使是semi-join也很难进行高效的查询。可以将子查询重写为OUTER JOIN语句并用连接条件对数据进行过滤。
# Query: 4A39009B402BAD9B
★ ★ ☆ ☆ ☆ 50分
```sql
SELECT
maxId, minId
FROM
(
SELECT
MAX( film_id) maxId, MIN( film_id) minId
FROM
film) as d
```
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## MySQL 对子查询的优化效果不佳
* **Item:** SUB.001
* **Severity:** L4
* **Content:** MySQL 将外部查询中的每一行作为依赖子查询执行子查询。 这是导致严重性能问题的常见原因。这可能会在 MySQL 5.6 版本中得到改善, 但对于5.1及更早版本, 建议将该类查询分别重写为 JOIN 或 LEFT OUTER JOIN。
## 不建议在子查询中使用函数
* **Item:** SUB.006
* **Severity:** L2
* **Content:** MySQL将外部查询中的每一行作为依赖子查询执行子查询,如果在子查询中使用函数,即使是semi-join也很难进行高效的查询。可以将子查询重写为OUTER JOIN语句并用连接条件对数据进行过滤。
...@@ -4637,3 +4637,151 @@ DROP ...@@ -4637,3 +4637,151 @@ DROP
DEFAULT DEFAULT
``` ```
# Query: B48292EDB9D0E010
★ ★ ☆ ☆ ☆ 40分
```sql
SELECT
maxId, minId
FROM
(
SELECT
MAX( film_id) maxId, MIN( film_id) minId
FROM
film
WHERE
last_update > '2016-03-27 02:01:01'
) as d
```
## Explain信息
| id | select\_type | table | partitions | type | possible_keys | key | key\_len | ref | rows | filtered | scalability | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | PRIMARY | *<derived2>* | NULL | system | NULL | NULL | NULL | NULL | 1 | ☠️ **100.00%** | O(1) | NULL |
| 2 | DERIVED | *film* | NULL | ALL | NULL | NULL | NULL | NULL | 1000 | 33.33% | ☠️ **O(n)** | Using where |
### Explain信息解读
#### SelectType信息解读
* **DERIVED**: 用于from子句里有子查询的情况. MySQL会递归执行这些子查询, 把结果放在临时表里.
* **PRIMARY**: 最外层的select.
#### Type信息解读
* **system**: 这是const连接类型的一种特例, 该表仅有一行数据(=系统表).
* ☠️ **ALL**: 最坏的情况, 从头到尾全表扫描.
#### Extra信息解读
* **Using where**: WHERE条件用于筛选出与下一个表匹配的数据然后返回给客户端. 除非故意做的全表扫描, 否则连接类型是ALL或者是index, 且在Extra列的值中没有Using Where, 则该查询可能是有问题的.
## 为sakila库的film表添加索引
* **Item:** IDX.001
* **Severity:** L2
* **Case:** ALTER TABLE \`sakila\`.\`film\` add index \`idx\_last\_update\` (\`last\_update\`) ;
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## MySQL 对子查询的优化效果不佳
* **Item:** SUB.001
* **Severity:** L4
* **Content:** MySQL 将外部查询中的每一行作为依赖子查询执行子查询。 这是导致严重性能问题的常见原因。这可能会在 MySQL 5.6 版本中得到改善, 但对于5.1及更早版本, 建议将该类查询分别重写为 JOIN 或 LEFT OUTER JOIN。
## 不建议在子查询中使用函数
* **Item:** SUB.006
* **Severity:** L2
* **Content:** MySQL将外部查询中的每一行作为依赖子查询执行子查询,如果在子查询中使用函数,即使是semi-join也很难进行高效的查询。可以将子查询重写为OUTER JOIN语句并用连接条件对数据进行过滤。
# Query: 4A39009B402BAD9B
★ ★ ☆ ☆ ☆ 50分
```sql
SELECT
maxId, minId
FROM
(
SELECT
MAX( film_id) maxId, MIN( film_id) minId
FROM
film) as d
```
## Explain信息
| id | select\_type | table | partitions | type | possible_keys | key | key\_len | ref | rows | filtered | scalability | Extra |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | PRIMARY | *<derived2>* | NULL | system | NULL | NULL | NULL | NULL | 1 | ☠️ **100.00%** | O(1) | NULL |
| 2 | DERIVED | *NULL* | NULL | NULL | NULL | NULL | NULL | NULL | 0 | 0.00% | NULL | Select tables optimized away |
### Explain信息解读
#### SelectType信息解读
* **DERIVED**: 用于from子句里有子查询的情况. MySQL会递归执行这些子查询, 把结果放在临时表里.
* **PRIMARY**: 最外层的select.
#### Type信息解读
* **system**: 这是const连接类型的一种特例, 该表仅有一行数据(=系统表).
#### Extra信息解读
* **Select tables optimized away**: 仅通过使用索引,优化器可能仅从聚合函数结果中返回一行。如:在没有 GROUP BY 子句的情况下,基于索引优化 MIN/MAX 操作,或者对于 MyISAM 存储引擎优化 COUNT(*) 操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。
## 最外层 SELECT 未指定 WHERE 条件
* **Item:** CLA.001
* **Severity:** L4
* **Content:** SELECT 语句没有 WHERE 子句,可能检查比预期更多的行(全表扫描)。对于 SELECT COUNT(\*) 类型的请求如果不要求精度,建议使用 SHOW TABLE STATUS 或 EXPLAIN 替代。
## MySQL 对子查询的优化效果不佳
* **Item:** SUB.001
* **Severity:** L4
* **Content:** MySQL 将外部查询中的每一行作为依赖子查询执行子查询。 这是导致严重性能问题的常见原因。这可能会在 MySQL 5.6 版本中得到改善, 但对于5.1及更早版本, 建议将该类查询分别重写为 JOIN 或 LEFT OUTER JOIN。
## 不建议在子查询中使用函数
* **Item:** SUB.006
* **Severity:** L2
* **Content:** MySQL将外部查询中的每一行作为依赖子查询执行子查询,如果在子查询中使用函数,即使是semi-join也很难进行高效的查询。可以将子查询重写为OUTER JOIN语句并用连接条件对数据进行过滤。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册