From 23ce65724a011279b2eca3282ba6ca752e3913cb Mon Sep 17 00:00:00 2001 From: Howie Date: Mon, 24 May 2021 17:25:33 +0800 Subject: [PATCH] planner: rewrite `LIKE` as range for expression index (#24250) --- .../explain_generate_column_substitute.result | 25 +++++++++++++++++++ .../t/explain_generate_column_substitute.test | 8 ++++++ .../core/rule_generate_column_substitute.go | 6 +++++ 3 files changed, 39 insertions(+) diff --git a/cmd/explaintest/r/explain_generate_column_substitute.result b/cmd/explaintest/r/explain_generate_column_substitute.result index 821988170dd87..2442479202c1a 100644 --- a/cmd/explaintest/r/explain_generate_column_substitute.result +++ b/cmd/explaintest/r/explain_generate_column_substitute.result @@ -389,3 +389,28 @@ explain format = 'brief' select c0 from t0; id estRows task access object operator info TableReader 10000.00 root data:TableFullScan └─TableFullScan 10000.00 cop[tikv] table:t0 keep order:false, stats:pseudo + -- TableRead +drop table if exists tbl1; +create table tbl1 (id int unsigned not null auto_increment primary key, s int, index((md5(s)))); +insert into tbl1 (id) select null; + insert into tbl1 (id) select null from tbl1; + insert into tbl1 (id) select null from tbl1; + insert into tbl1 (id) select null from tbl1; + insert into tbl1 (id) select null from tbl1; + insert into tbl1 (id) select null from tbl1; + insert into tbl1 (id) select null from tbl1; + insert into tbl1 (id) select null from tbl1; + insert into tbl1 (id) select null from tbl1; + insert into tbl1 (id) select null from tbl1; + insert into tbl1 (id) select null from tbl1; + insert into tbl1 (id) select null from tbl1; +update tbl1 set s=id%32; +explain format = 'brief' select count(*) from tbl1 where md5(s) like '02e74f10e0327ad868d138f2b4fdd6f%'; +id estRows task access object operator info +StreamAgg 1.00 root funcs:count(Column#6)->Column#4 +└─IndexReader 1.00 root index:StreamAgg + └─StreamAgg 1.00 cop[tikv] funcs:count(1)->Column#6 + └─IndexRangeScan 250.00 cop[tikv] table:tbl1, index:expression_index(md5(`s`)) range:["02e74f10e0327ad868d138f2b4fdd6f","02e74f10e0327ad868d138f2b4fdd6g"), keep order:false, stats:pseudo +select count(*) from tbl1 use index() where md5(s) like '02e74f10e0327ad868d138f2b4fdd6f%'; +count(*) +64 diff --git a/cmd/explaintest/t/explain_generate_column_substitute.test b/cmd/explaintest/t/explain_generate_column_substitute.test index 78096628c293d..395ed2311fda6 100644 --- a/cmd/explaintest/t/explain_generate_column_substitute.test +++ b/cmd/explaintest/t/explain_generate_column_substitute.test @@ -174,3 +174,11 @@ explain format = 'brief' select c0 from t0; -- TableRead drop table if exists t0; create table t0(c0 double, c1 float as (c0) unique); explain format = 'brief' select c0 from t0; -- TableRead + +drop table if exists tbl1; +create table tbl1 (id int unsigned not null auto_increment primary key, s int, index((md5(s)))); +insert into tbl1 (id) select null; insert into tbl1 (id) select null from tbl1; insert into tbl1 (id) select null from tbl1; insert into tbl1 (id) select null from tbl1; insert into tbl1 (id) select null from tbl1; insert into tbl1 (id) select null from tbl1; insert into tbl1 (id) select null from tbl1; insert into tbl1 (id) select null from tbl1; insert into tbl1 (id) select null from tbl1; insert into tbl1 (id) select null from tbl1; insert into tbl1 (id) select null from tbl1; insert into tbl1 (id) select null from tbl1; +update tbl1 set s=id%32; +explain format = 'brief' select count(*) from tbl1 where md5(s) like '02e74f10e0327ad868d138f2b4fdd6f%'; +select count(*) from tbl1 use index() where md5(s) like '02e74f10e0327ad868d138f2b4fdd6f%'; + diff --git a/planner/core/rule_generate_column_substitute.go b/planner/core/rule_generate_column_substitute.go index bc4a31e0b88e8..670753d0833ec 100644 --- a/planner/core/rule_generate_column_substitute.go +++ b/planner/core/rule_generate_column_substitute.go @@ -119,6 +119,12 @@ func (gc *gcSubstituter) substitute(ctx context.Context, lp LogicalPlan, exprToC tryToSubstituteExpr(expr, lp.SCtx(), candidateExpr, tp, x.Schema(), column) } } + case ast.Like: + expr := &sf.GetArgs()[0] + tp = sf.GetArgs()[1].GetType().EvalType() + for candidateExpr, column := range exprToColumn { + tryToSubstituteExpr(expr, lp.SCtx(), candidateExpr, tp, x.Schema(), column) + } } } case *LogicalProjection: