diff --git a/statistics/handle/gc.go b/statistics/handle/gc.go index 02862290d2efd..ff95558a0cf4e 100644 --- a/statistics/handle/gc.go +++ b/statistics/handle/gc.go @@ -176,6 +176,12 @@ func (h *Handle) deleteHistStatsFromKV(physicalID int64, histID int64, isIndex i if _, err := exec.ExecuteInternal(ctx, "delete from mysql.stats_fm_sketch where table_id = %? and hist_id = %? and is_index = %?", physicalID, histID, isIndex); err != nil { return err } + if isIndex == 0 { + // delete the record in mysql.column_stats_usage + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.column_stats_usage where table_id = %? and column_id = %?", physicalID, histID); err != nil { + return err + } + } return nil } @@ -221,6 +227,9 @@ func (h *Handle) DeleteTableStatsFromKV(statsIDs []int64) (err error) { if _, err = exec.ExecuteInternal(ctx, "delete from mysql.stats_fm_sketch where table_id = %?", statsID); err != nil { return err } + if _, err = exec.ExecuteInternal(ctx, "delete from mysql.column_stats_usage where table_id = %?", statsID); err != nil { + return err + } } return nil } diff --git a/statistics/handle/gc_test.go b/statistics/handle/gc_test.go index ac54ea337080a..500591d7f2625 100644 --- a/statistics/handle/gc_test.go +++ b/statistics/handle/gc_test.go @@ -134,3 +134,23 @@ func (s *testStatsSuite) TestGCExtendedStats(c *C) { c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) testKit.MustQuery("select name, type, column_ids, stats, status from mysql.stats_extended").Sort().Check(testkit.Rows()) } + +func (s *testStatsSuite) TestGCColumnStatsUsage(c *C) { + defer cleanEnv(c, s.store, s.do) + testKit := testkit.NewTestKit(c, s.store) + testKit.MustExec("use test") + testKit.MustExec("create table t(a int, b int, c int)") + testKit.MustExec("insert into t values (1,1,1),(2,2,2),(3,3,3)") + testKit.MustExec("analyze table t") + testKit.MustQuery("select count(*) from mysql.column_stats_usage").Check(testkit.Rows("3")) + testKit.MustExec("alter table t drop column a") + testKit.MustQuery("select count(*) from mysql.column_stats_usage").Check(testkit.Rows("3")) + h := s.do.StatsHandle() + ddlLease := time.Duration(0) + c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + testKit.MustQuery("select count(*) from mysql.column_stats_usage").Check(testkit.Rows("2")) + testKit.MustExec("drop table t") + testKit.MustQuery("select count(*) from mysql.column_stats_usage").Check(testkit.Rows("2")) + c.Assert(h.GCStats(s.do.InfoSchema(), ddlLease), IsNil) + testKit.MustQuery("select count(*) from mysql.column_stats_usage").Check(testkit.Rows("0")) +}