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语句优化非常有必要。
相关推荐
目录 如何删除某个字段的最后四个字符 1、第一种方法 2、第二种方法 剔除特定字符后面的所有内容 如何删除某个字段的最后四个字符 我们有的时候在进行数据操作的时候,会遇到一 目录如何删除某个字段的最后四个字符1、第一种方法2、第二种方法剔除特定字符后面的所有内容 如何删除某个字段的最后四个字符 我们有的时候在进行数据操作的时候,会遇到一些情况,例如有的时候,某个字段会多出现多余的东西。 比如城市c
织梦模板数据库链接修改方法分享 织梦(DedeCMS)是一种广泛使用的开源内容管理系统,广泛应用于各种网站。在安装和配置网站时,一个重要的步骤是连接数据库。在使用织梦模板的过程中,有时候需要修改数据库链接,这可能是因为你更换了数据库的用户名、密码或者数据库的地址。在这篇文章中,我们将会详细介绍修改织梦模板数据库链接的方法。 之一步:备份文件 在进行修改之前,首先需要备份网站的所有文件和数据库。通常
Redis数据库的表结构分析 Redis是一种快速,开源的内存键值数据库系统。它支持多种数据结构,包括字符串,哈希表,列表和集合等。Redis的高速性和灵活性使得它成为广泛应用于许多应用场景。为了更好地理解Redis的结构,本文将对Redis数据库的表结构进行详细分析。 1. Redis数据库的基础数据结构 Redis中的基础数据结构是键值对,它可以是字符串、哈希表、列表和集合。键是一个字符串,而
一,什么触发器 1,个人理解 触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了。你放炮仗,点燃了, 一,什么触发器 1,个人理解触发器,从字面来理解,一触即发的一个器,简称触发器(哈哈,个人理解),举个例子吧,好比天黑了,你开灯了,你看到东西了。你放炮仗,点燃了,一会就炸了。2,官方定义触发器(trigger)是个特殊的存储过程,
前言 作为整个 JDBC 专题的开篇,本章介绍 JDBC 标准和分类,让普通的 JDBC 用户和技术同学了解 JDBC,以及 OceanBase JDBC 对 MySQL 和 Oracle 兼容性做了哪些工作。 一、JDBC Standard 1.1 JDBC 概念 JDBC 一般指 Java 数据库连接。Java 数据库连接(Java Database Connectivity,简称 JDBC)
回到顶部
|