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的索引。
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?
发布于 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")。
更进一步的
PRIMARY KEY)。优化器将假定简单地扫描所有表会更快,忽略未通过clause.EXPLAIN FORMAT=JSON SELECT WHERE的行--这将为您提供更多信息。(对于这个简单的查询,可能没有更多的信息。)一个有用的惊喜是,它将显示单个提到的"filesort“实际上指的是多少个排序。(实现这一点的一种可能简单的方法是GROUP BY x ORDER BY y;即按不同的分组和排序很少有像你的"10001“这样干净的数字。通常,"rows“列是一个近似值,有时是一个可怕的近似值。STATUS值来获取“行检查”将是一种完整的100K.发布于 2020-06-19 01:14:14
第一个和最后一个查询使用与其他行进行隐式比较的WHERE,在这种情况下,它使用索引并将其显示在额外的字段(类型范围)中。
当你创建一个包含0-1个结果的条件时,它可以直接访问它们(O(1)查找)。不进行比较或排序,只取一行,返回它。
https://stackoverflow.com/questions/62454933
复制相似问题