1

我一直在研究索引,但不能完全理解 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 欺骗索引会比完全不使用索引要慢?

4

2 回答 2

0

它合并了几遍的结果。所以是的,你的假设是正确的。:)

http://dev.mysql.com/doc/refman/5.0/en/index-merge-optimization.html

在索引合并之前,mysql 无法满足来自索引的此类查询。

于 2012-03-05T14:56:39.907 回答
-1

你是对的。

MySQL 对这种类型的 IN 优化使用了与执行 JOIN 时相同的技术,并且 MySQL 能够进行大量的 JOIN,而不会对性能产生明显影响。

While the cost can eventually reach the point at which it becomes noticeable, it is still generally an advantage over not using an index at all.

Not using an index at all is only advantageous at the point in which you are returning a large percentage of the rows. MySQL is able to make the decision when to abandon the index.

于 2012-03-05T15:23:41.690 回答