gpt4 book ai didi

mysql - 为什么Mysql EXPLAIN中的EXTRA为NULL?为什么 >= 是使用索引条件?

转载 作者:行者123 更新时间:2023-12-03 14:42:18 24 4
gpt4 key购买 nike

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 的索引。
插入t 100000行数据
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();

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

there are some experiments

现在,我想知道;

(1)为什么 explain select * from t where a >= 90000;额外的是 Using index condition ?它有索引键,但没有索引过滤器和表过滤器,为什么是 Using index condition ?

(2)为什么 explain select * from t where a = 90000;额外的是 NULL ?需要访问表,如果第一种情况是 Using index condition ,为什么第二个不能是 Using index condition ?

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

最佳答案

首先,术语...

“使用索引”意味着(在这种情况下)INDEX(a)包含所有需要的列。那就是“索引正在覆盖”。

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

至于“在何处使用”;这对我来说仍然是个谜,即使在使用 MySQL 20 年并查看了数千个解释之后。我忽略它。

在您的所有 3 个案例中,INDEX(a)用来。这主要由“key”(“a”——键的名称,而不是列)、“key_len”(“5”:4 字节 INT 加 1 表示 NULLable )表示,其次由“类型”(不说“全部”)。

进一步

  • 如果将 90000 更改为 70000,您可能会发现它会切换到表扫描。为什么在索引的 BTree 和数据的 BTree 之间来回反弹(通过 PRIMARY KEY)。优化器会假设简单地扫描所有表会更快,忽略失败的行 WHERE条款。
  • EXPLAIN FORMAT=JSON SELECT -- 为您提供更多信息。 (对于这个简单的查询,可能没有更多信息。)一个有用的惊喜是它会显示“filesort”的单一提及真正指的是多少种类型。 (实现这一点的一个可能的简单方法是 GROUP BY x ORDER BY y ;即按不同的列分组和排序。)
  • 解释很少有这样干净的数字,比如你的“10001”。通常,“行”列是一个近似值,有时是一个可怕的近似值。
  • 慢日志记录“行检查”;它可能会为您的测试显示 10001(或者可能只有 10000)和 1。对于表扫描,它将是完整的 100K。
  • 另一种获得“行检查”的方法是通过“处理程序”STATUS值。见 http://mysql.rjweb.org/doc.php/index_cookbook_mysql#handler_counts
  • 关于mysql - 为什么Mysql EXPLAIN中的EXTRA为NULL?为什么 >= 是使用索引条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62454933/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com