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语句优化非常有必要。
相关推荐
如果您正在使用CentOS操作系统,并且需要在其上安装Oracle客户端,那么本文将为您提供详细的安装步骤和注意事项。Oracle客户端是用于连接Oracle数据库的软件,使用Oracle客户端,您可以在不必在服务器上直接安装Oracle数据库的情况下,通过网络连接Oracle数据库,进行数据的查询、修改和管理。 在安装Oracle客户端之前,需要确认您的系统是否已经安装了必要的环境依赖。Orac
模糊查询是指在数据库中查找与给定模式或部分值相匹配的记录,这种查询在需要搜索部分匹配或不确定确切值时非常有用。 大多数关系型数据库都提供了模糊查询的功能。以下是模糊查询的一些常见方法: LIKE操作符: LIKE操作符是实现模糊查询的常用方法。它允许使用通配符来定义搜索模式。常见的通配符包括: %:表示任意数量的字符(包括零个字符)。 _:表示一个字符。 以下是一个简单的LIKE操作符示例,查询f
CMD是Windows系统下的命令行工具,它可以帮助我们完成很多系统操作,例如更换Oracle实例的SID。Oracle是一款流行的关系型数据库,应用非常广泛,在使用Oracle时我们常常需要更换实例的SID。在本文中,我们将介绍如何使用CMD更换Oracle实例的SID。 假设我们的Oracle实例是running SID,现在需要更换为new SID。我们可以按照以下步骤进行操作: 1. 停止
Oracle 12911是Oracle数据库的一个错误码,表示表定义中的列长度不匹配。这个错误码在数据库开发和管理中是比较常见的。具体来说,当我们在创建表或者修改表定义时,如果其中一个列定义的长度与它在数据表中实际占用的空间不匹配,就会出现这个错误码。 例如,我们在创建一个名为"Employees"的表时,暂定它有三个列:员工姓名,员工编号和员工地址。我们在创建表时设定"员工姓名"列长度为60字节
解决MongoDB技术开发中遇到的备份与恢复问题的方法研究 摘要:随着数据量的不断增长和业务系统的复杂性提升,数据备份和恢复变得越来越重要。本文将重点研究MongoDB技术开发中备份与恢复问题,并提供了具体的代码示例。 引言MongoDB是一个非关系型数据库系统,具备高性能、易扩展、灵活的特点,在大数据应用方面表现出色。然而,对于MongoDB开发者来说,备份与恢复成为一项关键任务,因为数据的丢失
回到顶部
|