【问题标题】:Mysql index 'and' chooses index that was created first always?Mysql index 'and' 总是选择首先创建的索引?
【发布时间】:2015-08-20 19:04:13
【问题描述】:

https://dev.mysql.com/doc/internals/en/optimizer-and-relations.html

文章说如果两个条件都被索引并且具有相同的连接类型,它使用首先创建的索引。

在某个索引具有更高基数的情况下,选择该索引作为驱动程序不是更好吗?不应该查询存储引擎吗?

如果不应该在这些情况下强制索引,如果我对基数有一个想法?

【问题讨论】:

  • 如果我没记错的话,您的问题将属于第 2 步 - MySQL 会选择具有更好连接类型的索引,不是吗?如果一个索引更好,它将被选择而不是另一个。只有当索引具有相同的连接类型时,才会选择第一个。我在现实世界中从未见过使用更差的索引而不是更好的索引。然而,有趣的问题,+1,让我们看看其他人有什么要说的。
  • Join 类型指的是 mysql 的 join 类型。参考dev.mysql.com/doc/internals/en/…,据我了解。
  • 我知道它指的是什么,我已阅读文档。因此,具有较高基数的索引具有更好的连接类型。因此,您的问题属于mysql文档解释的第2步,不是吗?
  • example select * from table where key_1 > X and key_2 > Y, 都是范围连接类型.. 不管基数如何。基数不影响连接类型。是吗?
  • 您可以让非唯一索引产生 eq_ref,所以我会假设基数确实会影响更好索引的选择。

标签: mysql indexing cardinality


【解决方案1】:

我想知道这个文档是不是已经过时了。毕竟,该描述似乎使analyze table 变得非常有用。那就是documented

MySQL 使用存储的密钥分布来决定 当您对其他东西执行连接时,应该连接表 比一个常数。此外,密钥分布可用于 决定为查询中的特定表使用哪些索引。

此描述与内部文档中的文档特别矛盾。

或者,这个参考可能写得不好,适用于没有其他密钥分发信息可用的情况。正如您所说,使用具有 更高 基数的索引可能是一个更好的起点。

此外,如文档本身所述,“连接类型”的使用是一个糟糕的描述。这实际上应该被称为“比较类型”,或者类似的东西。

【讨论】:

  • 或者,在计算实际的表连接顺序等时,可能是指存储的键分布,但在计算单个表条件下的“comparison_types”时,并没有考虑到它们。
  • 另外,我希望这已经过时了。 :D
  • 我怀疑引用的文件完全是错误的。首先,使用首先创建的索引并不是一种可能或似是而非的启发式方法。
猜你喜欢
  • 2017-05-08
  • 2011-09-28
  • 2011-09-01
  • 2018-01-02
  • 2015-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多