MySQLl数据量不一样,导致走不同的索引

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介:

1、测试环境:MySQL 5.7.17

2、测试表结构

1
2
3
4
5
6
7
8
9
10
11
mysql> show  create  table  a;
+ -------+--------------------------------------------------------------------------------------------------------------------------------------+
Table  Create  Table                                                                                                                          |
+ -------+--------------------------------------------------------------------------------------------------------------------------------------+
| a     |  CREATE  TABLE  `a` (
   `id`  int (11)  NOT  NULL ,
   ` name char (20)  DEFAULT  NULL ,
   PRIMARY  KEY  (`id`)
) ENGINE=InnoDB  DEFAULT  CHARSET=gbk |
+ -------+--------------------------------------------------------------------------------------------------------------------------------------+
1 row  in  set  (0.00 sec)
1
2
3
4
5
6
7
8
9
10
11
mysql> show  create  table  b;
+ -------+------------------------------------------------------------------------------------------------------------------------------------+
Table  Create  Table                                                                                                                        |
+ -------+------------------------------------------------------------------------------------------------------------------------------------+
| b     |  CREATE  TABLE  `b` (
   `id`  int (11)  NOT  NULL ,
   `tx`  char (20)  DEFAULT  NULL ,
   PRIMARY  KEY  (`id`)
) ENGINE=InnoDB  DEFAULT  CHARSET=gbk |
+ -------+------------------------------------------------------------------------------------------------------------------------------------+
1 row  in  set  (0.00 sec)


3、两张表的数据量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
mysql>  select  count (*)  from  a;
+ ----------+
count (*) |
+ ----------+
|        7 |
+ ----------+
1 row  in  set  (0.00 sec)
mysql>  select  count (*)  from  b;
+ ----------+
count (*) |
+ ----------+
|       10 |
+ ----------+
1 row  in  set  (0.00 sec)


4、查看执行计划

1
2
3
4
5
6
7
8
mysql> explain  select  name  from  a,b  where  a.id=b.id;
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
| id | select_type |  table  | partitions | type   | possible_keys |  key      | key_len | ref       |  rows  | filtered | Extra       |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
|  1 | SIMPLE      | a     |  NULL        ALL     PRIMARY        NULL     NULL     NULL       |    7 |   100.00 |  NULL         |
|  1 | SIMPLE      | b     |  NULL        | eq_ref |  PRIMARY        PRIMARY  | 4       | apex.a.id |    1 |   100.00 | Using  index  |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
rows  in  set , 1 warning (0.00 sec)
1
2
3
4
5
6
7
8
mysql> explain  select  name  from  a,b  where  b.id=a.id;
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
| id | select_type |  table  | partitions | type   | possible_keys |  key      | key_len | ref       |  rows  | filtered | Extra       |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
|  1 | SIMPLE      | a     |  NULL        ALL     PRIMARY        NULL     NULL     NULL       |    7 |   100.00 |  NULL         |
|  1 | SIMPLE      | b     |  NULL        | eq_ref |  PRIMARY        PRIMARY  | 4       | apex.a.id |    1 |   100.00 | Using  index  |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
rows  in  set , 1 warning (0.00 sec)
1
2
3
4
5
6
7
8
mysql> explain  select  name  from  b,a  where  b.id=a.id;
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
| id | select_type |  table  | partitions | type   | possible_keys |  key      | key_len | ref       |  rows  | filtered | Extra       |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
|  1 | SIMPLE      | a     |  NULL        ALL     PRIMARY        NULL     NULL     NULL       |    7 |   100.00 |  NULL         |
|  1 | SIMPLE      | b     |  NULL        | eq_ref |  PRIMARY        PRIMARY  | 4       | apex.a.id |    1 |   100.00 | Using  index  |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
rows  in  set , 1 warning (0.00 sec)



5、向a表插入3数据,使两表数据量一样,查看执行计划,发现第三条语句的执行计划发生了变化

1
2
3
4
5
6
7
8
9
10
11
12
13
mysql>  insert  into  values (8, 'test' );
Query OK, 1 row affected (0.00 sec)
mysql>  insert  into  values (9, 'test' );
Query OK, 1 row affected (0.00 sec)
mysql>  insert  into  values (10, 'test' );
Query OK, 1 row affected (0.01 sec)
mysql>  select  count (*)  from  a;
+ ----------+
count (*) |
+ ----------+
|       10 |
+ ----------+
1 row  in  set  (0.00 sec)
1
2
3
4
5
6
7
8
mysql> explain  select  name  from  a,b  where  a.id=b.id;
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
| id | select_type |  table  | partitions | type   | possible_keys |  key      | key_len | ref       |  rows  | filtered | Extra       |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
|  1 | SIMPLE      | a     |  NULL        ALL     PRIMARY        NULL     NULL     NULL       |   10 |   100.00 |  NULL         |
|  1 | SIMPLE      | b     |  NULL        | eq_ref |  PRIMARY        PRIMARY  | 4       | apex.a.id |    1 |   100.00 | Using  index  |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
rows  in  set , 1 warning (0.00 sec)
1
2
3
4
5
6
7
8
mysql> explain  select  name  from  a,b  where  b.id=a.id;
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
| id | select_type |  table  | partitions | type   | possible_keys |  key      | key_len | ref       |  rows  | filtered | Extra       |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
|  1 | SIMPLE      | a     |  NULL        ALL     PRIMARY        NULL     NULL     NULL       |   10 |   100.00 |  NULL         |
|  1 | SIMPLE      | b     |  NULL        | eq_ref |  PRIMARY        PRIMARY  | 4       | apex.a.id |    1 |   100.00 | Using  index  |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
rows  in  set , 1 warning (0.00 sec)
1
2
3
4
5
6
7
8
mysql> explain  select  name  from  b,a  where  b.id=a.id;
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
| id | select_type |  table  | partitions | type   | possible_keys |  key      | key_len | ref       |  rows  | filtered | Extra       |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
|  1 | SIMPLE      | b     |  NULL        index   PRIMARY        PRIMARY  | 4       |  NULL       |   10 |   100.00 | Using  index  |
|  1 | SIMPLE      | a     |  NULL        | eq_ref |  PRIMARY        PRIMARY  | 4       | apex.b.id |    1 |   100.00 |  NULL         |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
rows  in  set , 1 warning (0.00 sec)

6、向a表插入1条数据,使a表数据量大于b表,查看执行计划,三条语句执行计划都发现了变化

1
2
3
4
5
6
7
8
9
mysql>  insert  into  values (11, 'test' );
Query OK, 1 row affected (0.01 sec)
mysql>  select  count (*)  from  a;
+ ----------+
count (*) |
+ ----------+
|       11 |
+ ----------+
1 row  in  set  (0.00 sec)
1
2
3
4
5
6
7
8
mysql> explain  select  name  from  a,b  where  a.id=b.id;
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
| id | select_type |  table  | partitions | type   | possible_keys |  key      | key_len | ref       |  rows  | filtered | Extra       |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
|  1 | SIMPLE      | b     |  NULL        index   PRIMARY        PRIMARY  | 4       |  NULL       |   10 |   100.00 | Using  index  |
|  1 | SIMPLE      | a     |  NULL        | eq_ref |  PRIMARY        PRIMARY  | 4       | apex.b.id |    1 |   100.00 |  NULL         |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
rows  in  set , 1 warning (0.00 sec)
1
2
3
4
5
6
7
8
mysql> explain  select  name  from  a,b  where  b.id=a.id;
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
| id | select_type |  table  | partitions | type   | possible_keys |  key      | key_len | ref       |  rows  | filtered | Extra       |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
|  1 | SIMPLE      | b     |  NULL        index   PRIMARY        PRIMARY  | 4       |  NULL       |   10 |   100.00 | Using  index  |
|  1 | SIMPLE      | a     |  NULL        | eq_ref |  PRIMARY        PRIMARY  | 4       | apex.b.id |    1 |   100.00 |  NULL         |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
rows  in  set , 1 warning (0.00 sec)
1
2
3
4
5
6
7
8
mysql> explain  select  name  from  b,a  where  b.id=a.id;
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
| id | select_type |  table  | partitions | type   | possible_keys |  key      | key_len | ref       |  rows  | filtered | Extra       |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
|  1 | SIMPLE      | b     |  NULL        index   PRIMARY        PRIMARY  | 4       |  NULL       |   10 |   100.00 | Using  index  |
|  1 | SIMPLE      | a     |  NULL        | eq_ref |  PRIMARY        PRIMARY  | 4       | apex.b.id |    1 |   100.00 |  NULL         |
+ ----+-------------+-------+------------+--------+---------------+---------+---------+-----------+------+----------+-------------+
rows  in  set , 1 warning (0.01 sec)




本文转自 corasql 51CTO博客,原文链接:http://blog.51cto.com/corasql/1913105,如需转载请自行联系原作者
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
缓存 定位技术 数据库
如何优化大表的查询速度?
如何优化大表的查询速度
38 1
|
6月前
|
关系型数据库 MySQL 数据库
MySQL索引优化:深入理解索引合并
MySQL索引优化:深入理解索引合并
|
6月前
|
存储 关系型数据库 MySQL
【高频】什么是索引的下推和覆盖
【高频】什么是索引的下推和覆盖
237 2
|
SQL 关系型数据库 MySQL
Mysql数据量统计:一条sql查询所有表的数据量、数据大小、索引大小
Mysql数据量统计:一条sql查询所有表的数据量、数据大小、索引大小
255 0
|
数据库 索引
索引是越多越好嘛? 什么样的字段需要建索引
索引的作用是加快数据库的查询速度,但并不是索引越多越好。过多的索引会增加数据库的存储空间和维护成本,并且在写操作时可能会降低性能。
234 0
|
关系型数据库 MySQL 索引
一个表中索引的数量是不是越多越好?
往InnoDB表新增数据时,都会基于主键给自动建立聚簇索引。 随着我们不停的在表里插入数据,会不停的在数据页里插入数据。一个数据页放满后,就会分裂成多个数据页,这时就需要索引页去指向各个数据页。
130 0
|
存储 NoSQL 算法
数据索引
数据索引
|
存储 SQL 关系型数据库