在 MySQL 文档关于避免全表扫描的部分中,MySQL 将使用全表扫描的一种情况描述如下:
您正在通过另一列使用具有低基数的键(许多行与键值匹配)。在这种情况下,MySQL 假设通过使用该键可能会执行许多键查找,并且表扫描会更快。
我很难理解这一点。
首先,我不确定是否应该将短语解析为“使用键......通过另一列”或“低基数......通过另一列”。两种解释似乎都不清晰。
我可以大致了解,如果我选择表格的很大一部分,比如 75% 或其他什么,那么索引的使用速度将比仅读取整个表格要慢(因为需要深入获取行)。但我不明白“通过另一列”与它有什么关系。
谁能解释一下这句话?
您引用的陈述与前面的要点相反,它说:
换句话说,第一种情况(将键列与常数进行比较,例如
...where last_name = 'Smith'
)允许优化器使用键列的值分布(直方图)来估计谓词选择性。在第二种情况下(将键列与另一列进行比较,例如
...where last_name in (select last_name from some_other_table)
)不会为优化器提供足够的信息来使用直方图,因此它只是使用键基数来做出决定。我同意“使用密钥……通过另一列”这句话听起来有点尴尬。“将键...与另一列进行比较”会更清楚。