From ceaf58815416528ac93a5a0c18d53527092f684b Mon Sep 17 00:00:00 2001 From: Leon Zhang Date: Tue, 28 May 2019 12:28:17 +0800 Subject: [PATCH] explain add test cases go test -update ./... --- advisor/testdata/TestListTestSQLs.golden | 2 + ast/testdata/TestCompress.golden | 4 + ast/testdata/TestFormat.golden | 23 + ast/testdata/TestPretty.golden | 23 + ast/testdata/TestQueryType.golden | 2 + ast/testdata/TestSchemaMetaInfo.golden | 4 + ast/testdata/TestTokenize.golden | 4 + ast/testdata/TestTokenizer.golden | 2 +- common/cases.go | 4 + common/testdata/TestStringStorageReq.golden | 580 +++++++++--------- database/explain.go | 1 + .../testdata/TestShowCreateDatabase.golden | 2 +- database/testdata/TestShowTables.golden | 3 - .../test_Check_Soar_SQL_Fingerprint.golden | 2 + ..._Check_Soar_SQL_Rewrite_Mergealter_.golden | 2 + ...Check_Soar_SQL_pretty_And_Compress_.golden | 2 + .../test_Check_get_tables_from_SQL.golden | 12 + .../test_Check_soar_for_pipe_input.golden | 83 +++ ...est_Check_soar_query_for_input_file.golden | 83 +++ test/fixture/test_Run_all_test_cases.golden | 148 +++++ 20 files changed, 691 insertions(+), 295 deletions(-) diff --git a/advisor/testdata/TestListTestSQLs.golden b/advisor/testdata/TestListTestSQLs.golden index 2bdc112..bbcac4e 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 0430dc3..8c0f6f7 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 6f56da7..6d5c40c 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 6aa57d4..9a2b1db 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 d54070f..dec2d25 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 cfe8075..14ec590 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 9510667..b1dcdef 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 bf6a8df..87a1c2d 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 503d4b4..280bdea 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 da1f23d..e2c8f59 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 022fbb6..fae57e5 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 85dc9c8..0b0cc40 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 32a52ee..27a6ad5 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 10f2fca..a9618d7 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 e450f5d..d41279f 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 8916aef..3be6620 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 c39cd86..6b8a7bc 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 9a7698b..a4bd3db 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 9a7698b..a4bd3db 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 3697e4f..00534de 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语句并用连接条件对数据进行过滤。 + -- GitLab