我一直在研究索引,但不能完全理解 MYSQL 是如何将索引完全用于诸如此类的语句的
IN() AND IN() ... AND IN()
我正在阅读的这本书建议,当我们有一个索引 ( a
, b
, ...) 但用户想要搜索b
并且我们在 中的基数较低时a
,我们可以使用一个技巧并简单地添加 IN()
WHERE a IN ('x1', 'x2', ... 'all possible values go here') AND `b`>123
假设我们有以下数据
x1 1
x1 4
x1 456
x2 5
x3 1
x3 2
x3 3
x4 1234
它如何遍历这棵树来满足上面的查询?它会简单地为 IN-s 创建所有可能的组合,并且几乎会为每个查询遍历树吗?
WHERE `a`='x1' AND `b`>123
WHERE `a`='x2' AND `b`>123
...
因此使这个技巧的用处有限,因为随着 IN 数量的增加,所有可能的 IN 组合的数量急剧增加,我们必须为这些组合中的每一个运行 B 树?如果上述情况属实,这是否意味着存在某种理论上的观点,即用 IN 欺骗索引会比完全不使用索引要慢?