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语句优化非常有必要。
相关推荐
在Oracle中,char是一种非常重要的数据类型,可以用来存储固定长度的字符串数据。char通常用于存储类似于邮政编码、账户号码等长度固定的数据,具有不可变性,即存储在表中的字符串长度始终保持不变。 CREATE TABLE EXAMPLE( ID NUMBER, NAME CHAR(10), PHONE CHAR(11), EMAIL CHAR(30) ); 例如,上面的示例中,我们创建了一个
MySQL连接错误1267,如何解决? MySQL是一种常用的关系型数据库管理系统,在使用MySQL时,有时候会遇到各种各样的错误。其中,“错误1267”是指在插入或更新数据时,所插入的值不符合列的定义。遇到这种错误时,我们应该如何解决呢? 首先,我们需要了解错误1267是如何产生的。当我们在插入或更新数据时,MySQL会将数据与列的定义进行比对,以确保数据的合法性。如果发现插入的数据类型不符合列
MAC 中mysql密码忘记解决办法 最近项目用到MySQL,之前装过一个,可是忘记了当时设置的密码,然后走上了修改密码的坎坷道路。在百度,Google了一堆资料之后还是,发现处处是给程序员 MAC 中mysql密码忘记解决办法 最近项目用到MySQL,之前装过一个,可是忘记了当时设置的密码,然后走上了修改密码的坎坷道路。在百度,Google了一堆资料之后还是,发现处处是给程序员埋的坑。于是下决心
随着互联网的发展,越来越多的软件系统采用了Web应用程序的形式,这些系统通常需要进行用户登录验证来限制用户的权限。而Java作为一种十分流行的编程语言,也为我们提供了丰富的工具和库来实现这一过程。 本文将介绍如何使用Java语言来实现基于数据库的用户登录验证功能。文章将涵盖以下几个方面:Java Web应用程序的基础概念、数据库的基础知识和Java数据库连接(JDBC)的基础知识,以及如何使用Ja
检查 MySQL 启动是否正常 MySQL 是一种常见的关系型数据库管理系统,运行 MySQL 时,可能会发现 MySQL 打开后没有反应。这时候,可以按照下面的方式来检查 MySQL 是否启动正常。 1. 检查 MySQL 服务 Windows 使用服务管理器(services.msc),Unix/Linux 使用 systemctl 或 service 命令来启动和停止服务。 2. 检查 My
回到顶部
|