为什么MySQL会在有可能的密钥时使用密钥

pil*_*ght 1 mysql sql indexing primary-key

因此,每当我解释我的查询时,我经常得到一些实例,其中它将某些字段表示为可能的键,但是密钥表将为空...

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

Rob*_*Dee 7

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

我给你举个例子:

比如说,您有一个已编入索引的性别字段,但您的记录中有90%是女性.优化器可以使用索引,但由于数据的扩展是倾斜的,因此执行全表扫描可能更有效.

  • 如果90%是女性,如果您选择了男性,MySQL可能会使用索引.虽然它的基数低,但选择性仍然很高.它仍取决于将返回的行数.如果你试图选择女性,MySQL会想要进行全表扫描. (2认同)

Kei*_*all 5

它不能总是使用密钥,例如:

SELECT * FROM A, B where A.id = B.id;
Run Code Online (Sandbox Code Playgroud)

尽管id两个查找都是可能的关键,但它不能用于两者.其中一个表必须进行全面扫描.