首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >MySQL 8.0统计信息不准确?

MySQL 8.0统计信息不准确?

提问于 2021-01-27 07:24:52
回答 5关注 2查看 1.2K

MySQL 5.7下的场景

(1)首先,创建两张表,并插入数据

代码语言:javascript
复制
mysql >选择版本(); 
+  -  -  -  -  -  -  +  
|  版本()   |  
+  -  -  -  -  -  -  +  
|   5.7。30  -日志|  
+  -  -  -  -  -  -  +  
1行中集合(0.00秒)

的MySQL的>显示创建表测试\ G变变
**  **  **  **  **  **  **  **  **  **  **  **  **  *   1。排**  **  **  **  **  **  **  **  **  **  **  **  **  *
       表:测试
创建表:CREATE TABLE `test`(
   `id`   INT(10)无符号NOT NULL AUTO_INCREMENT,
   `k`   INT(10)无符号NOT NULL DEFAULT '0',
   `C`炭(120)NOT NULL DEFAULT '',
   `pad`   char(60)NOT NULL DEFAULT ”,
  主键(`id`),
  键`k_1`(`k`)
)ENGINE = InnoDB的AUTO_INCREMENT =  101个字符集= utf8mb4 MAX_ROWS =百万
1行中集合(0.00秒)

的MySQL的>显示创建表sbtest1 \ G变变
**  **  **  **  **  **  **  **  **  **  **  **  **  *   1。第**  **  **  **  **  **  **  **  **  **  **  **  **  **  *
       表:sbtest1
创建表:CREATE TABLE`sbtest1`(
   `id`   int(10)unsigned NOT NULL AUTO_INCREMENT,
   `k`   int(10)unsigned NOT NULL DEFAULT'0 ',
   `c`   char(120)NOT NULL DEFAULT',
   `pad `   char(60)非空默认值”,
  主键(`id`),
  键`k_1`(`k`)
)ENGINE = InnoDB的AUTO_INCREMENT =  1000001个字符集= utf8mb4 MAX_ROWS =百万
1行中集合(0.00秒)

的MySQL >从测试中选择计数(*); +  -  -  -  -  -  +  |数(*)|  +  -  -  -  -  -  +  |  100  |  +  -  -  -  -  -  +  1行中集合(0.00秒)

  

       

  

mysql >从sbtest1选择计数(*); +  -  -  -  -  -  +  |数(*)|  +  -  -  -  -  -  +  |  1000000  |  +  -  -  -  -  -  +  1行中集合(0.14秒)

(2)查看两张表的统计信息,均比较准确

代码语言:javascript
复制
mysql >从表名=  '测试'的表中选择table_schema,table_name,table_rows ;  +  -  -  -  -  -  -  -  +  -  -  -  -  -  -  +  -  -  -  -  -  -  +  | table_schema | table_name | table_rows |  +  -  -  -  -  -  -  -  +


-  -  -  -  -  -  +  -  -  -  -  -  -  +  
|测试         |测试       |          100   |  
+  -  -  -  -  -  -  -  +  -  -  -  -  -  -  +  -  -  -  -  -  -  +  
1行中集合(0.00秒)

mysql >从表名=  'sbtest1'的表中选择table_schema,table_name,table_rows ;  +  -  -  -  -  -  -  -  +  -  -  -  -  -  -  +  -  -  -  -  -  -  +  | table_schema | table_name | table_rows |  +  -  -  -  -  -  -  -  +


-  -  -  -  -  -  +  -  -  -  -  -  -  +  
|测试         | sbtest1      |       947263   |  
+  -  -  -  -  -  -  -  +  -  -  -  -  -  -  +  -  -  -  -  -  -  +  
1行中集合(0.00秒)

(3)我们持续往test表插入1000w条记录,并再次查看统计信息,还是相对准确的,因为在位置情况下,数据变化量超过10%,就会触发统计信息更新

代码语言:javascript
复制
的MySQL >从测试中选择计数(*); +  -  -  -  -  -  +  |数(*)|  +  -  -  -  -  -  +  |  10000100  |  +  -  -  -  -  -  +  1行中集合(1.50秒)

  

  

  

mysql >从表名=  '测试'的表中选择table_schema,table_name,table_rows ;  +  -  -  -  -  -  -  -  +  -  -  -  -  -  -  +  -  -  -  -  -  -  +  | table_schema | table_name | table_rows |  +  -  -  -  -  -  -  -  +


-  -  -  -  -  -  +  -  -  -  -  -  -  +  
|测试         |测试       |      9749036   |  
+  -  -  -  -  -  -  -  +  -  -  -  -  -  -  +  -  -  -  -  -  -  +  
1行中集合(0.00秒)

MySQL 8.0下的场景

(1)接下来我们看看8.0下的情况吧,同样地,我们创建两张表,并插入相同记录

代码语言:javascript
复制
mysql >选择版本(); 
+  -  -  -  -  -  -  +  
|  版本()|  
+  -  -  -  -  -  -  +  
|   8.0。20      |  
+  -  -  -  -  -  -  +  
1行中集合(0.00秒)

的MySQL的>显示创建表测试\ G变变
**  **  **  **  **  **  **  **  **  **  **  **  **  *   1。排**  **  **  **  **  **  **  **  **  **  **  **  **  *
       表:测试
创建表:CREATE TABLE `test`(
  `id` INT无符号NOT NULL AUTO_INCREMENT,
  `k` INT无符号NOT NULL DEFAULT '0' ,`C`
  炭(120)NOT NULL DEFAULT '' ,`pad`
  炭(60)非空默认值”,
  主键(`id`),
  键`k_1`(`k`)
)引擎= InnoDB AUTO_INCREMENT =  101时间的字符集= utf8mb4 COLLATE = utf8mb4_0900_ai_ci MAX_ROWS =百万
1行中集合(0.00秒)

的MySQL的>显示创建表sbtest1 \ G变变
**  **  **  **  **  **  **  **  **  **  **  **  **  *   1。第**  **  **  **  **  **  **  **  **  **  **  **  **  **  *
       表:sbtest1
创建表:CREATE TABLE`sbtest1`(
   `id` INT无符号NOT NULL AUTO_INCREMENT,
   `k` INT无符号NOT NULL缺省'0',
   `C`炭(120)NOT NULL DEFAULT ”,
   ``pad`炭(60)非空默认值”,
  主键(`id`),
  键`k_1`(`k`)
)引擎= InnoDB AUTO_INCREMENT =  1000001默认的字符集= utf8mb4 COLLATE = utf8mb4_0900_ai_ci MAX_ROWS =百万
1行中集合(0.00秒)

的MySQL >从测试中选择计数(*); +  -  -  -  -  -  +  |数(*)|  +  -  -  -  -  -  +  |  100  |  +  -  -  -  -  -  +  1行中集合(0.00秒)

  

       

  

mysql >从sbtest1选择计数(*); +  -  -  -  -  -  +  |数(*)|  +  -  -  -  -  -  +  |  1000000  |  +  -  -  -  -  -  +  1行中集合(0.02秒)

(2)查看两张表的统计信息,均比较准确

代码语言:javascript
复制
mysql >从表名=  '测试'的表中选择table_schema,table_name,table_rows ;  +  -  -  -  -  -  -  -  +  -  -  -  -  -  -  +  -  -  -  -  -  -  +  | TABLE_SCHEMA | TABLE_NAME | TABLE_ROWS |  +  -  -  -  -  -  -  -  +


-  -  -  -  -  -  +  -  -  -  -  -  -  +  
|测试         |测试       |          100   |  
+  -  -  -  -  -  -  -  +  -  -  -  -  -  -  +  -  -  -  -  -  -  +  
1行中集合(0.00秒)

mysql >从表名=  'sbtest1'的表中选择table_schema,table_name,table_rows ;  +  -  -  -  -  -  -  -  +  -  -  -  -  -  -  +  -  -  -  -  -  -  +  | TABLE_SCHEMA | TABLE_NAME | TABLE_ROWS |  +  -  -  -  -  -  -  -  +


-  -  -  -  -  -  +  -  -  -  -  -  -  +  
|测试         | sbtest1      |       947468   |  
+  -  -  -  -  -  -  -  +  -  -  -  -  -  -  +  -  -  -  -  -  -  +  
1行中集合(0.01秒)

(3)同样地,我们持续往test表插入1000w条记录,并再次查看统计信息,发现table_rows显示还是100条,出现了偏差

代码语言:javascript
复制
mysql >从测试中选择count (* ) ;+ - - - - - + | 数(* )| + - - - - - + | 10000100 | + - - - - - + 1行中集合(0.33秒)

  

  

  

mysql >从table_name = 'test'的表中选择table_schema , table_name , table_rows ; + - - - - - - - + - - - - - - + - - - - - - + | TABLE_SCHEMA | TABLE_NAME | TABLE_ROWS | + - - - - - - - +


- - - - - - + - - - - - - + 
| 测试         | 测试       |         100  | 
+ - - - - - - - + - - - - - - + - - - - - - + 
1行中 集合 (0.00秒)
相关文章

相似问题

相关问答用户
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档