M字节(D+2 , 如果M CREATE TABLE `test1` (
`id` bigint NOT NULL AUTO_INCREMENT,
`a` int NOT NULL,
`b` int NOT NULL,
`c` int NOT NULL,
PRIMARY KEY (`id`),
KEY `idx_mult` (`a`,`b`,`c`)
) ENGINE=InnoDB;
mysql> EXPLAIN select * from test1 where a=1;
mysql> EXPLAIN select * from test1 where a=1 and b=2;
mysql> EXPLAIN select * from test1 where a=1 and b=2 and c=3;

EXPLAIN的结果“几乎“相同,都用到索引idx_mult,唯一不同的是key_len。根据索引长度key_len,可以推断多维索引使用了前缀索引机制。
idx_mult是二维索引KEY (a,b,c),因此INT类型长度应该是4+4+4=12
a=1 key_len是4,a=1 and b=1 key_len是8 ,a=1 and b=2 and c=3 key_len是12,前面即“不完全”用到索引才能得到结果。
Extra
Extra列包含有关如何解析查询的附加信息,却又十分重要。按照目前提供的官方说明,起码有36个信息可参考。
几个常输出的附加信息。
附件信息 |
说明 |
Using where |
表示使用了where条件搜索,但没有使用索引。 |
Using index |
表示用到了覆盖索引,即在索引上就查到了所需数据,无需二次回表查询,性能较好。 |
Using filesort |
表示使用了外部排序,即排序字段没有用到索引。) |
Using temporary |
表示用到了临时表,下面的示例中就是用到临时表来存储查询结果。 |
Using join buffer |
表示在进行表关联的时候,没有用到索引,使用了连接缓存区存储临时结果。 |
还有其他日常很少见的附加信息
1.Zero limit
查询包含LIMIT 0子句,无法选择任何行。
mysql> EXPLAIN select * from employees01 where emp_no < 100 Limit 0;
+----+-------------+-------+------+。。。+----------+------------+
| id | select_type | table | rows |。。。|filtered | Extra |
+----+-------------+-------+------+。。。+----------+------------+
| 1 | SIMPLE | NULL | NULL |。。。| NULL | Zero limit |
+----+-------------+-------+------+。。。+----------+------------+
1 row in set, 1 warning (0.00 sec)
2.No tables used
查询没有FROM子句。
root@localhost: 12:05: [employees]> explain select 1;
+----+-------------+-------+------+。。。+----------+----------------+
| id | select_type | table | rows |。。。|filtered | Extra |
+----+-------------+-------+------+。。。+----------+----------------+
| 1 | SIMPLE | NULL | NULL |。。。| NULL | No tables used |
+----+-------------+-------+------+。。。+----------+----------------+
1 row in set, 1 warning (0.00 sec)
3.Distinct
MySQL正在寻找不同的值,因此在找到第一个匹配的行后,它将停止为当前行组合搜索更多的行。
4.unique row not found
对于SELECT这样的查询。。。FROM tbl_name,没有行满足表上UNIQUE索引或PRIMARY KEY的条件。
5.Scanned N databases
这表示在处理INFORMATION_SCHEMA表查询时执行的目录扫描次数。
6.Plan isn’t ready yet
EXPLAIN FOR CONNECTION会出现此值,当优化器尚未完成为在命名连接中执行的语句创建执行计划时。
7.Deleting all rows
对于DELETE,一些存储引擎(如MyISAM)支持以简单快捷的方式删除所有表行的处理程序方法。
总结
了解和解读Explain输出信息,对SQL语句优化非常有必要。
相关推荐
在日常的应用开发中,我们经常会遇到需要使用多种不同类型的数据库管理系统来满足各种业务需求。其中最典型的就是Redis和MySQL的组合使用。 这两者拥有各自的优点,例如Redis为高性能的内存数据库提供了极快的读写速度,而MySQL则是非常强大的关系型数据库,支持事务处理,并且提供了很好的数据一致性。 然而,在实际应用过程中,如何保证Redis和MySQL双写时的数据一致性问题成为了开发者们面临的
在进行Oracle数据库应用开发的过程中,我们可能会遇到1455错误,该错误可能会对我们的应用程序造成严重的影响。本文将详细介绍Oracle 1455错误是什么,该错误会对应用程序产生哪些影响,以及该如何避免和解决该错误。 Oracle 1455错误指的是ORA-1455错误,它是一个非常常见的错误。该错误可能发生的原因有很多种,比如重复读取数据、数据库事务并发等。当我们在使用Oracle进行应用
Oracle 1756是一个非常流行的数据库管理系统,它具有强大的数据存储和处理能力。它可以用于数据管理、应用程序开发、商业智能等多种领域,在各种企业和组织中被广泛使用。 相比其他数据库管理系统,Oracle 1756拥有更高的可扩展性和稳定性,能够支持超过1000万个并发用户,处理复杂的数据处理任务。下面我们看看它的一些优势。 数据安全:Oracle 1756通过采用强大的加密技术、数据管理策略
触发器(trigger)是数据库的一类对象,与表关联,当表中指定的事件发生时,比如插入数据,更新数据,删除数据,触发器就会被激活,来执行一些SQL语句。 触发器不能建立在临时表或者视图上。 触发器的名称在schema的命名空间里,也就是说一个数据库里面的触发器名称必须唯一。 创建触发器的用户需要有TRIGGER权限。 1. 触发器创建语法 创建触发器使用create trigger语法,如下: C
1. 语法介绍 有三张表a、b、c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段。对于这种情况,可以使用如下的语句来实现: INSERT INTO db1_name (field1,field2) SELECT field 1. 语法介绍有三张表a、b、c,现在需要从表b和表c中分别查几个字段的值插入到表a中对应的字段。对于这种情况,可以使用如下的语句来实现:INSERT INT
回到顶部
|