CREATE TABLE `t` ( `id` int(11) NOT NULL, `a` int(11) DEFAULT NULL, `b` int(11) DEFAULT NULL, PRIMARY KEY (`id`), KEY `a` (`a`), KEY `b` (`b`) ) ENGINE=InnoDB; select * from t where a between 10000 and 20000; 表里有100000条数据 使用explain命令看到的这条语句的执行情况
时间: 2023-07-13 16:06:31 浏览: 142
MySQL创建数据表(CREATE TABLE语句)
这条 SQL 语句的执行情况可以通过 MySQL 的 Explain 命令来查看,具体命令如下:
```
EXPLAIN SELECT * FROM t WHERE a BETWEEN 10000 AND 20000;
```
执行该命令后,MySQL 会返回一张表格,其中包含了该 SQL 语句的执行计划。这个表格的列意义如下:
- id:每个操作的唯一标识符,可以用来表示操作的顺序;
- select_type:操作的类型,包括 SIMPLE(简单查询)、PRIMARY(主查询)、UNION(联合查询)等;
- table:操作涉及的表;
- partitions:匹配的分区(如果有的话);
- type:访问类型,包括 ALL(全表扫描)、INDEX(索引扫描)、RANGE(范围查询)、REF(基于索引的查询)、EQ_REF(基于唯一索引的查询)等;
- possible_keys:可以使用的索引;
- key:实际使用的索引;
- key_len:索引使用的字节数;
- ref:索引使用的列或常量;
- rows:估计要扫描的行数;
- filtered:返回结果的行数占全部结果集的比例;
- Extra:额外的信息,包括 Using filesort(需要排序)、Using temporary(需要临时表)等。
在这个例子中,假设表 t 中的数据是随机分布的,那么该 SQL 语句的执行计划可能如下:
```
id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra
----------------------------------------------------------------------------------------------------------------
1 | SIMPLE | t | NULL | range | a | a | 4 | NULL | 2000 | 20.00 | NULL
```
从执行计划中可以看到,该 SQL 语句使用了表 t 上的 a 索引,并且访问类型是 range(范围查询),表示 MySQL 会扫描 a 字段在 10000 到 20000 之间的所有行。估计要扫描的行数是 2000 行,而返回结果的行数占全部结果集的比例是 20.00%。这个执行计划比较理想,因为它使用了索引,并且只扫描了需要的行数,可以快速返回结果。
阅读全文