diff --git a/advisor/testdata/TestListTestSQLs.golden b/advisor/testdata/TestListTestSQLs.golden index 2bdc112fa732e94eeea57ab4d20399f875b58efa..bbcac4eca73342c37635877f826b313cebff5302 100644 --- a/advisor/testdata/TestListTestSQLs.golden +++ b/advisor/testdata/TestListTestSQLs.golden @@ -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); select * from tb where data >= ''; 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; diff --git a/ast/testdata/TestCompress.golden b/ast/testdata/TestCompress.golden index 0430dc3164909f2c0880f5647ad1912d91e0d5de..8c0f6f7260cdc05cd2899fd7ffaf313c4816453c 100644 --- a/ast/testdata/TestCompress.golden +++ b/ast/testdata/TestCompress.golden @@ -168,3 +168,7 @@ 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 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; diff --git a/ast/testdata/TestFormat.golden b/ast/testdata/TestFormat.golden index 6f56da71b1102973e516f871a5f85d839b5766fe..6d5c40cfcdf06d372c08e39ba7e0155530fd2f5c 100644 --- a/ast/testdata/TestFormat.golden +++ b/ast/testdata/TestFormat.golden @@ -880,3 +880,26 @@ 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; diff --git a/ast/testdata/TestPretty.golden b/ast/testdata/TestPretty.golden index 6aa57d445421f6f2305974c5180ed727cece9c14..9a2b1db835117462cb19d2e492179d7bc72f3e4a 100644 --- a/ast/testdata/TestPretty.golden +++ b/ast/testdata/TestPretty.golden @@ -1524,4 +1524,27 @@ 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; select 1 diff --git a/ast/testdata/TestQueryType.golden b/ast/testdata/TestQueryType.golden index d54070fa590d4dd234f42a825e8f1bf4b4b32148..dec2d25fd17a3e0cb591c6ee27279d299949dec0 100644 --- a/ast/testdata/TestQueryType.golden +++ b/ast/testdata/TestQueryType.golden @@ -88,3 +88,5 @@ SELECT CREATE SELECT ALTER +SELECT +SELECT diff --git a/ast/testdata/TestSchemaMetaInfo.golden b/ast/testdata/TestSchemaMetaInfo.golden index cfe80751906211a1474ad296244486895a6cf7cd..14ec5902908d42bfe7643e30b3c947974a0f1fb8 100644 --- a/ast/testdata/TestSchemaMetaInfo.golden +++ b/ast/testdata/TestSchemaMetaInfo.golden @@ -190,3 +190,7 @@ select * from tb where data >= ''; [`sakila`.`tb`] alter table tb alter column id drop default; [`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`] diff --git a/ast/testdata/TestTokenize.golden b/ast/testdata/TestTokenize.golden index 95106671794a07f1760783750f8dc2b130e64009..b1dcdef24b05189328b91e704684cca560f65971 100644 --- a/ast/testdata/TestTokenize.golden +++ b/ast/testdata/TestTokenize.golden @@ -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}] 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}] +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}] diff --git a/ast/testdata/TestTokenizer.golden b/ast/testdata/TestTokenizer.golden index bf6a8df2b8fb320f33edd440f3ac55308e6124b1..87a1c2df4ac850a691ae7fe83c46a4e381841940 100644 --- a/ast/testdata/TestTokenizer.golden +++ b/ast/testdata/TestTokenizer.golden @@ -210,7 +210,7 @@ } []ast.Token{ {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:57353, Val:"from", i:0}, {Type:57396, Val:"tbl", i:0}, diff --git a/common/cases.go b/common/cases.go index 503d4b4c29ce285930f1eaef9fc89f8d735e528d..280bdeaaf485dce32b08b2f8432991be27fd6489 100644 --- a/common/cases.go +++ b/common/cases.go @@ -205,5 +205,9 @@ func init() { // https://github.com/XiaoMi/soar/issues/163 "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;", } } diff --git a/common/testdata/TestStringStorageReq.golden b/common/testdata/TestStringStorageReq.golden index da1f23d5cdba224c4147515de3d85640c9302145..e2c8f594b02c8a4099cb7070fc11a3ef33f1af8b 100644 --- a/common/testdata/TestStringStorageReq.golden +++ b/common/testdata/TestStringStorageReq.golden @@ -1,3 +1,13 @@ +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(256) hebrew 255 binary(10) hebrew 10 @@ -8,26 +18,16 @@ enum('G','PG','PG-13','R','NC-17') hebrew 1 set('one', 'two') hebrew 1 not_exist hebrew 0 char(-1) hebrew 0 -char(10) latin2 10 -char(256) latin2 255 -binary(10) latin2 10 -binary(256) latin2 255 -varchar(10) latin2 11 -varbinary(10) latin2 11 -enum('G','PG','PG-13','R','NC-17') latin2 1 -set('one', 'two') latin2 1 -not_exist latin2 0 -char(-1) latin2 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) 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) cp1250 10 char(256) cp1250 255 binary(10) cp1250 10 @@ -38,6 +38,26 @@ enum('G','PG','PG-13','R','NC-17') cp1250 1 set('one', 'two') cp1250 1 not_exist 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(256) eucjpms 765 binary(10) eucjpms 10 @@ -48,6 +68,86 @@ enum('G','PG','PG-13','R','NC-17') eucjpms 1 set('one', 'two') eucjpms 1 not_exist 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(256) latin1 255 binary(10) latin1 10 @@ -58,6 +158,36 @@ enum('G','PG','PG-13','R','NC-17') latin1 1 set('one', 'two') latin1 1 not_exist 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(256) macce 255 binary(10) macce 10 @@ -68,26 +198,16 @@ enum('G','PG','PG-13','R','NC-17') macce 1 set('one', 'two') macce 1 not_exist macce 0 char(-1) macce 0 -char(10) tis620 10 -char(256) tis620 255 -binary(10) tis620 10 -binary(256) tis620 255 -varchar(10) tis620 11 -varbinary(10) tis620 11 -enum('G','PG','PG-13','R','NC-17') tis620 1 -set('one', 'two') tis620 1 -not_exist tis620 0 -char(-1) tis620 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) ujis 30 +char(256) ujis 765 +binary(10) ujis 10 +binary(256) ujis 255 +varchar(10) ujis 31 +varbinary(10) ujis 31 +enum('G','PG','PG-13','R','NC-17') ujis 1 +set('one', 'two') ujis 1 +not_exist ujis 0 +char(-1) ujis 0 char(10) utf16le 40 char(256) utf16le 1020 binary(10) utf16le 10 @@ -98,36 +218,26 @@ enum('G','PG','PG-13','R','NC-17') utf16le 1 set('one', 'two') utf16le 1 not_exist utf16le 0 char(-1) utf16le 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) cp852 10 -char(256) cp852 255 -binary(10) cp852 10 -binary(256) cp852 255 -varchar(10) cp852 11 -varbinary(10) cp852 11 -enum('G','PG','PG-13','R','NC-17') cp852 1 -set('one', 'two') cp852 1 -not_exist cp852 0 -char(-1) cp852 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) 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) gb2312 20 +char(256) gb2312 510 +binary(10) gb2312 10 +binary(256) gb2312 255 +varchar(10) gb2312 21 +varbinary(10) gb2312 21 +enum('G','PG','PG-13','R','NC-17') gb2312 1 +set('one', 'two') gb2312 1 +not_exist gb2312 0 +char(-1) gb2312 0 char(10) gbk 20 char(256) gbk 510 binary(10) gbk 10 @@ -138,76 +248,6 @@ enum('G','PG','PG-13','R','NC-17') gbk 1 set('one', 'two') gbk 1 not_exist 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(256) greek 255 binary(10) greek 10 @@ -218,26 +258,56 @@ enum('G','PG','PG-13','R','NC-17') greek 1 set('one', 'two') greek 1 not_exist greek 0 char(-1) greek 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) armscii8 10 -char(256) armscii8 255 -binary(10) armscii8 10 -binary(256) armscii8 255 -varchar(10) armscii8 11 -varbinary(10) armscii8 11 -enum('G','PG','PG-13','R','NC-17') armscii8 1 -set('one', 'two') armscii8 1 -not_exist armscii8 0 -char(-1) armscii8 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) 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) 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(256) cp850 255 binary(10) cp850 10 @@ -248,36 +318,36 @@ enum('G','PG','PG-13','R','NC-17') cp850 1 set('one', 'two') cp850 1 not_exist cp850 0 char(-1) cp850 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) ujis 30 -char(256) ujis 765 -binary(10) ujis 10 -binary(256) ujis 255 -varchar(10) ujis 31 -varbinary(10) ujis 31 -enum('G','PG','PG-13','R','NC-17') ujis 1 -set('one', 'two') ujis 1 -not_exist ujis 0 -char(-1) ujis 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) cp852 10 +char(256) cp852 255 +binary(10) cp852 10 +binary(256) cp852 255 +varchar(10) cp852 11 +varbinary(10) cp852 11 +enum('G','PG','PG-13','R','NC-17') cp852 1 +set('one', 'two') cp852 1 +not_exist cp852 0 +char(-1) cp852 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) latin2 10 +char(256) latin2 255 +binary(10) latin2 10 +binary(256) latin2 255 +varchar(10) latin2 11 +varbinary(10) latin2 11 +enum('G','PG','PG-13','R','NC-17') latin2 1 +set('one', 'two') latin2 1 +not_exist latin2 0 +char(-1) latin2 0 char(10) cp866 10 char(256) cp866 255 binary(10) cp866 10 @@ -288,36 +358,16 @@ enum('G','PG','PG-13','R','NC-17') cp866 1 set('one', 'two') cp866 1 not_exist cp866 0 char(-1) cp866 0 -char(10) gb2312 20 -char(256) gb2312 510 -binary(10) gb2312 10 -binary(256) gb2312 255 -varchar(10) gb2312 21 -varbinary(10) gb2312 21 -enum('G','PG','PG-13','R','NC-17') gb2312 1 -set('one', 'two') gb2312 1 -not_exist gb2312 0 -char(-1) gb2312 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) armscii8 10 +char(256) armscii8 255 +binary(10) armscii8 10 +binary(256) armscii8 255 +varchar(10) armscii8 11 +varbinary(10) armscii8 11 +enum('G','PG','PG-13','R','NC-17') armscii8 1 +set('one', 'two') armscii8 1 +not_exist armscii8 0 +char(-1) armscii8 0 char(10) ascii 10 char(256) ascii 255 binary(10) ascii 10 @@ -328,36 +378,6 @@ enum('G','PG','PG-13','R','NC-17') ascii 1 set('one', 'two') ascii 1 not_exist 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(256) sjis 510 binary(10) sjis 10 @@ -368,43 +388,23 @@ enum('G','PG','PG-13','R','NC-17') sjis 1 set('one', 'two') sjis 1 not_exist sjis 0 char(-1) sjis 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) 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) 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 +char(10) tis620 10 +char(256) tis620 255 +binary(10) tis620 10 +binary(256) tis620 255 +varchar(10) tis620 11 +varbinary(10) tis620 11 +enum('G','PG','PG-13','R','NC-17') tis620 1 +set('one', 'two') tis620 1 +not_exist tis620 0 +char(-1) tis620 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 diff --git a/database/explain.go b/database/explain.go index 022fbb68c906268d10e19d8dd024e6a50a137452..fae57e581849fd0bc397f7b1ede8df390fa31926 100644 --- a/database/explain.go +++ b/database/explain.go @@ -378,6 +378,7 @@ var ExplainExtra = map[string]string{ "No tables used": "查询没有FROM子句, 或者有一个 FROM DUAL子句.", "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.", + "Select tables optimized away": "仅通过使用索引,优化器可能仅从聚合函数结果中返回一行。如:在没有 GROUP BY 子句的情况下,基于索引优化 MIN/MAX 操作,或者对于 MyISAM 存储引擎优化 COUNT(*) 操作,不必等到执行阶段再进行计算,查询执行计划生成的阶段即完成优化。", "Using intersect": "开启了index merge,即:对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,使用的算法为:index_merge_intersection", "Using union": "开启了index merge,即:对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,使用的算法为:index_merge_union", "Using sort_union": "开启了index merge,即:对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,使用的算法为:index_merge_sort_union", diff --git a/database/testdata/TestShowCreateDatabase.golden b/database/testdata/TestShowCreateDatabase.golden index 85dc9c85fce4f33025f7263a1f242dee642743fe..0b0cc40d1e49b8ecc383863f787a8cf64387b84c 100644 --- a/database/testdata/TestShowCreateDatabase.golden +++ b/database/testdata/TestShowCreateDatabase.golden @@ -1 +1 @@ -CREATE DATABASE `sakila` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ +CREATE DATABASE `sakila` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci */ /*!80016 DEFAULT ENCRYPTION='N' */ diff --git a/database/testdata/TestShowTables.golden b/database/testdata/TestShowTables.golden index 32a52ee40e1ff456c4d39f8e07028f99d7cf888e..27a6ad5d1f84e6e101e9dfec5f3baf6fccfe182a 100644 --- a/database/testdata/TestShowTables.golden +++ b/database/testdata/TestShowTables.golden @@ -21,6 +21,3 @@ sales_by_store staff staff_list store -t_clinic_info -t_partition_list -test_id diff --git a/test/fixture/test_Check_Soar_SQL_Fingerprint.golden b/test/fixture/test_Check_Soar_SQL_Fingerprint.golden index 10f2fca8102112161e1afb68a90ff407e2a208ae..a9618d722adecf886f13c3b303b0b0e68216c141 100644 --- a/test/fixture/test_Check_Soar_SQL_Fingerprint.golden +++ b/test/fixture/test_Check_Soar_SQL_Fingerprint.golden @@ -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) select * from tb where data >= ? 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 diff --git a/test/fixture/test_Check_Soar_SQL_Rewrite_Mergealter_.golden b/test/fixture/test_Check_Soar_SQL_Rewrite_Mergealter_.golden index e450f5df88859ae02f939b3a6a676de66ada9f8b..d41279f5e1d19dfa15626562619b48f9bd7d9c02 100644 --- a/test/fixture/test_Check_Soar_SQL_Rewrite_Mergealter_.golden +++ b/test/fixture/test_Check_Soar_SQL_Rewrite_Mergealter_.golden @@ -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 last_update FROM film GROUP 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 LIMIT 10 SELECT release_year, language_id, sum(length) FROM film GROUP BY release_year, language_id diff --git a/test/fixture/test_Check_Soar_SQL_pretty_And_Compress_.golden b/test/fixture/test_Check_Soar_SQL_pretty_And_Compress_.golden index 8916aef15e246818be3ed683d651fe258785cab4..3be66207b9cbbd2d2a15bfc32f137c83c2e1dfcd 100644 --- a/test/fixture/test_Check_Soar_SQL_pretty_And_Compress_.golden +++ b/test/fixture/test_Check_Soar_SQL_pretty_And_Compress_.golden @@ -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); SELECT * FROM tb WHERE data >= ''; 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; diff --git a/test/fixture/test_Check_get_tables_from_SQL.golden b/test/fixture/test_Check_get_tables_from_SQL.golden index c39cd8682f6d72398d7e5e677d13f714ec05d980..6b8a7bc6e6880551de45e8aff4a628d16a3754f3 100644 --- a/test/fixture/test_Check_get_tables_from_SQL.golden +++ b/test/fixture/test_Check_get_tables_from_SQL.golden @@ -91,6 +91,9 @@ "`unknown`.`city`", "`unknown`.`country`" ], + "4A39009B402BAD9B": [ + "`unknown`.`film`" + ], "4E73AA068370E6A8": [ "`unknown`.`film`" ], @@ -190,6 +193,9 @@ "B3C502B4AA344196": [ "`unknown`.`film`" ], + "B48292EDB9D0E010": [ + "`unknown`.`film`" + ], "B862978586C6338B": [ "`unknown`.`city`", "`unknown`.`country`" @@ -364,6 +370,9 @@ "`sakila`.`city`", "`sakila`.`country`" ], + "4A39009B402BAD9B": [ + "`sakila`.`film`" + ], "4E73AA068370E6A8": [ "`sakila`.`film`" ], @@ -463,6 +472,9 @@ "B3C502B4AA344196": [ "`sakila`.`film`" ], + "B48292EDB9D0E010": [ + "`sakila`.`film`" + ], "B862978586C6338B": [ "`sakila`.`city`", "`sakila`.`country`" diff --git a/test/fixture/test_Check_soar_for_pipe_input.golden b/test/fixture/test_Check_soar_for_pipe_input.golden index 9a7698b777ca848bdab9c1e2b951843f99229dd7..a4bd3db1145ea5675951ff032fa57a4b5d62419c 100644 --- a/test/fixture/test_Check_soar_for_pipe_input.golden +++ b/test/fixture/test_Check_soar_for_pipe_input.golden @@ -2503,3 +2503,86 @@ DROP ## 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语句并用连接条件对数据进行过滤。 + diff --git a/test/fixture/test_Check_soar_query_for_input_file.golden b/test/fixture/test_Check_soar_query_for_input_file.golden index 9a7698b777ca848bdab9c1e2b951843f99229dd7..a4bd3db1145ea5675951ff032fa57a4b5d62419c 100644 --- a/test/fixture/test_Check_soar_query_for_input_file.golden +++ b/test/fixture/test_Check_soar_query_for_input_file.golden @@ -2503,3 +2503,86 @@ DROP ## 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语句并用连接条件对数据进行过滤。 + diff --git a/test/fixture/test_Run_all_test_cases.golden b/test/fixture/test_Run_all_test_cases.golden index 3697e4f49f4af6943d464e9069bdf1bfbdf125de..00534dec23e294e2a6dc20b52be8f7f02a6f2fd4 100644 --- a/test/fixture/test_Run_all_test_cases.golden +++ b/test/fixture/test_Run_all_test_cases.golden @@ -4637,3 +4637,151 @@ DROP 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 | ** | 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 | ** | 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语句并用连接条件对数据进行过滤。 +