gpt4 book ai didi

Mysql 在选择非索引字段时不使用索引

转载 作者:行者123 更新时间:2023-11-29 07:23:37 25 4
gpt4 key购买 nike

我有一个具有以下结构的表meta(这只是一个非规范化数据的示例)

`id` int(3) not null auto_increment primary key,
`category_id` int(3),
`subdomain` varchar(191),
`created_at` timestamp,
`updated_at` timestamp

subdomain 字段可以存储唯一值和重复值,如 'general' 可以重复多次

情况一

我还有一个索引 subdomain。该索引应用于查询

Select `id` from `table` where `subdomain` = 'general'

但是当我尝试获取一些非索引字段时,mysql 扫描所有表并且未使用索引

Select `created_at` from `table` where `subdomain` = 'general'

据我所知,Inno-db 非聚集索引存储对行的引用,无需对所有行执行线性搜索来检索某些字段。

我也知道优化器可以为人类选择一个意想不到的计划,但在这种情况下可能是什么原因?

无论表中有多少数据,结果始终相同。

最佳答案

当索引支持的过滤不是很有选择性/您要过滤的值具有高基数时,就会发生这种情况。这意味着您的总行中有很大一部分匹配索引支持的 where-condition(例如,90% 的行匹配 subdomain = 'general')。如果您在这种情况下使用索引,与全表扫描相比,您最终会处理更多数据。

示例:您有 100 行,其中 90 行匹配 subdomain = 'general'

全表扫描需要访问所有 100 行以检查条件并读取 90 个值作为结果。

索引支持的选择需要访问索引中满足条件的 90 个项目,并按照从索引到实际行的指针从该行中选择未索引的值。最终在索引上进行 90 次查找 + 从行中读取 90 次 = 180 次操作。这比全表扫描要慢,在全表扫描中您只是访问一些超出需要的行。这些操作的成本可能不同,但您最终会做更多的工作。

关于Mysql 在选择非索引字段时不使用索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54962518/

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