gpt4 book ai didi

MySQL 索引和 OR 运算符

转载 作者:行者123 更新时间:2023-11-29 05:23:14 24 4
gpt4 key购买 nike

好的,我这里有一个表,我在自动递增的列 id 上设置了一个主索引。然而,有时我需要通过另一个名为 owner 的列进行搜索,因为多个项目可以有相同的所有者,所以我无法放置唯一索引,所以我继续放置一个 index索引。我运行了一个查询

EXPLAIN SELECT * FROM 表 WHERE owner = 15 OR owner = 16

然后对于可能的 key ,我得到了预期的 owner,对于使用过的 key ,我得到了 NULL。我猜这是因为我的行数太少,但是如果我运行

EXPLAIN SELECT * FROM table WHERE owner = 15

对于可能的键,我得到 owner,对于使用过的键,我也得到 owner,行数相同。

所以这让我不确定这个索引在更大范围内是否有用,如果这个索引在 OR 条件下没有用,你们能告诉我怎么做吗我必须为表编制索引,以便它不会在 OR 的情况下遍历所有记录。

感谢您的关注。

最佳答案

如果您搜索的值出现在表的很大一部分中,则 MySQL 优化器不会使用索引。根据我的经验,“非常大”意味着大约占表的 20%。

所以可能是所有者 15 有点罕见,但是所有者 15 和 16 一起超过了阈值,所以它们代表了表的很大一部分,优化器决定进行表扫描或索引扫描.

例如,查看 EXPLAIN 的 rows 字段中报告的内容。如果优化器认为检查的行数超过表大小的 20%,那么就会发生这种情况。请记住,此处和 SHOW TABLE STATUS 中报告的行数 只是粗略估计。

我见过优化器的这种行为不是正确选择的情况,使用索引会更好。在这种情况下,您可以让优化器认为表扫描的成本过高:

SELECT * FROM table FORCE INDEX(owner) WHERE owner = 15 OR owner = 16

关于MySQL 索引和 OR 运算符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23159966/

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