所以每当我解释我的查询时,我经常会得到一些实例,其中它将某些字段表示为可能的键,但是密钥表将为null ...
为什么MySQL会这样做并决定不使用密钥,而事实上它可以使用可能的密钥?
答案 0 :(得分:7)
优化器可能会合理地计算出使用索引会导致性能低于全表扫描。
我会举个例子:
比如说,您有一个已编入索引的性别字段,但有90%的记录是女性。优化器可以使用索引,但由于数据的传播是倾斜的,因此执行全表扫描可能更有效。
答案 1 :(得分:5)
它不能总是使用密钥,例如:
SELECT * FROM A, B where A.id = B.id;
虽然id
是两个查找的可能键,但它们不能使用。其中一个表必须进行全面扫描。