【问题标题】:why would MySQL not use keys when there are possible keys当有可能的键时,为什么 MySQL 不使用键
【发布时间】:2012-08-02 19:18:42
【问题描述】:

因此,每当我解释我的查询时,我经常会得到一些实例,其中它将某些字段声明为可能的键,但随后键表将为空...

为什么 MySQL 会这样做并决定不使用任何键,而实际上它可以使用可能的键?

【问题讨论】:

  • 你能显示一个示例查询吗?

标签: mysql sql indexing primary-key


【解决方案1】:

优化器可以合理地计算出使用索引会导致比全表扫描更差的性能。

我给你举个例子:

假设您有一个已编入索引的性别字段,但您的记录中有 90% 是女性。优化器可以使用索引,但由于数据的分布是倾斜的,因此仅执行全表扫描可能更有效。

【讨论】:

  • 如果 90% 是女性,如果您选择男性,MySQL 可能会使用索引。尽管它的基数较低,但选择性仍然很高。它仍然取决于将返回的行数。如果您尝试选择女性,MySQL 会进行全表扫描。
  • 正是——数据的查询和传播将被优化器用来确定最佳执行计划。
【解决方案2】:

它不能总是使用一个键,例如:

SELECT * FROM A, B where A.id = B.id;

虽然id 是两个查找的可能键,但它不能同时用于。其中一个表必须执行完整扫描。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-08
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多