- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
好的,我这里有一个表,我在自动递增的列 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/
我是一名优秀的程序员,十分优秀!