繁体   English   中英

查询优化器如何确定何时执行全表扫描或索引扫描?

[英]How Query optimizer determines when to perform full table scan or Index scan?

我刚刚开始探索 SQL 中的执行计划,但我无法弄清楚查询优化器如何决定何时进行全表扫描或索引扫描。

我在链接中可用的数据库上运行了几个查询。

我在员工表上运行的查询之一是,

select * from classicmodels.employees e where e.officeCode =1;

employees 表有 officeCode 作为索引之一,

在此处输入图像描述

我猜想使用 officeCode 进行索引扫描就足够了,但是根据执行计划,执行了全表扫描。

在此处输入图像描述

有人可以解释为什么执行全表扫描而不是索引扫描吗?

最常见的原因是优化器估计使用索引实际上比简单地读取所有行的成本更高。

如果您正在搜索的特定值(在本例中 officeCode 值为 1)出现在足够大的行子集上,则优化器会认为仅读取索引条目然后将其重定向到表行是浪费时间。 出于同样的原因,一本书后面的索引中不包含非常常见的单词。

另一个因素是数据是分页读入 RAM 的,因此如果您的表非常小,它可能会将所有行都放在一个页面上。 一旦将搜索范围缩小到单个页面,索引的好处就微不足道了。 由于数据存储在与索引不同的页面上,因此使用索引甚至可能导致读取更多页面,而不仅仅是在单个页面上进行表扫描。

您的视觉解释表明,表扫描检查的行数约为 23 行,所以我猜这些可能位于一页上。

您可能想阅读https://dev.mysql.com/doc/refman/8.0/en/cost-model.html

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM