首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么Mysql EXPLAIN中的额外值为空?为什么>=使用索引条件?

为什么Mysql EXPLAIN中的额外值为空?为什么>=使用索引条件?
EN

Stack Overflow用户
提问于 2020-06-19 00:35:15
回答 2查看 913关注 0票数 6
代码语言:javascript
复制
mysql> 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

有一个名为t的表,它有两个名为a和b的索引。

代码语言:javascript
复制
mysql> create procedure idata()
  begin
   declare i int;
     set i=1;
     while(i<=100000)do
       insert into t values(i, i, i);
       set i=i+1;
     end while;
   end;
Query OK, 0 rows affected (0.01 sec)

mysql> delimiter ;
mysql> call idata();

我做了一些实验,其中一些如下

现在,我想知道;

(1)为什么explain select * from t where a >= 90000; extra是Using index condition?它有索引键,但没有索引筛选器和表筛选器,那么为什么它是Using index condition

(2)为什么explain select * from t where a = 90000; extra是NULL?如果第一种情况是Using index condition,那么为什么第二种情况不能是Using index condition呢?

(3)为什么explain select a from t where a >= 90000; extra是Using where; Using index?我知道它使用封面索引,所以extra有Using index;但是为什么extra有Using where?这意味着服务器需要过滤数据吗?但是存储引擎已经返回了正确的,为什么服务器需要filer?

EN

回答 2

Stack Overflow用户

发布于 2020-06-20 11:34:39

首先,术语...

“使用索引”意味着(在本例中) INDEX(a)包含所需的所有列。这就是“指数覆盖范围”。

“使用索引条件”是完全不同的。在内部,它被称为ICP (索引条件下推)。这指的是“处理程序”是否检查表达式,或者是否将“条件”( >= 90000)交给引擎(InnoDB)来完成工作。

至于“在哪里使用”,这对我来说仍然是一个谜,即使在使用MySQL 20年并寻找了成千上万的解释之后。我忽略了它。

在所有3种情况下,都使用了INDEX(a)。这主要由"key_len“(”a“--键的名称,而不是列)、”INT“("5":4字节类型加1表示类型)表示,其次由”NULLable“表示(不说"All")。

更进一步的

  • 如果您将90000更改为70000,您可能会发现它将切换到表扫描。为什么要在索引的BTree和数据的BTree之间来回切换(通过PRIMARY KEY)。优化器将假定简单地扫描所有表会更快,忽略未通过clause.
  • EXPLAIN FORMAT=JSON SELECT WHERE的行--这将为您提供更多信息。(对于这个简单的查询,可能没有更多的信息。)一个有用的惊喜是,它将显示单个提到的"filesort“实际上指的是多少个排序。(实现这一点的一种可能简单的方法是GROUP BY x ORDER BY y;即按不同的分组和排序很少有像你的"10001“这样干净的数字。通常,"rows“列是一个近似值,有时是一个可怕的近似值。
  • 将记录”已检查的行数“;它可能会显示为10001 (或者可能只有10000),而对于您的测试,它可能为1。对于表扫描,通过“处理程序”的STATUS值来获取“行检查”将是一种完整的100K.
  • Another方式。请参阅http://mysql.rjweb.org/doc.php/index_cookbook_mysql#handler_counts
票数 2
EN

Stack Overflow用户

发布于 2020-06-19 01:14:14

第一个和最后一个查询使用与其他行进行隐式比较的WHERE,在这种情况下,它使用索引并将其显示在额外的字段(类型范围)中。

当你创建一个包含0-1个结果的条件时,它可以直接访问它们(O(1)查找)。不进行比较或排序,只取一行,返回它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62454933

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档