MySql Explain忽略特定查询中的唯一索引

时间:2012-12-25 19:02:22

标签: mysql select indexing explain

我第一次开始深入研究Index(es),并开始首次从users表开始分析我们的db。我搜索了SO以找到类似的问题,但我猜不能很好地构建我的搜索。

我正在经历一个特定的概念,第一个观察让我感到疑惑 - 这些解释的区别[差异:第一个查询使用'a%',而第二个查询使用'ab%']

[{1}}表格中的总行数= 9193 ]:

users

enter image description here

(实际匹配列= 1240

1) explain select * from users where email_address like 'a%';

enter image description here

(实际匹配列= 109

索引如下所示: enter image description here

我的问题: 为什么在第一个查询中完全忽略索引? mySql是否认为不使用2) explain select * from users where email_address like 'ab%'; 中的索引更好?如果是,为什么?

2 个答案:

答案 0 :(得分:0)

这不是您问题的直接答案,但我仍想指出(如果您已经不知道):

尝试:

explain select email_address from users where email_address like 'a%';
explain select email_address from users where email_address like 'ab%';

MySQL现在将在上述两个查询中使用索引,因为感兴趣的列可直接从索引中获得。

可能在您执行“select *”的情况下,索引访问的成本更高,因为optmizer必须遍历索引记录,找到行ID然后返回到表以检索其他列值。 / p>

但是在上面只查看“select email_address”的查询中,optmizer知道索引中所有可用的信息,因此它将使用索引而不管30%的规则。

专家,如果我错了,请纠正我。

答案 1 :(得分:0)

如果基于概率的mysql收集的值分布的概率高于总行的一定比例(通常是总行数的1/11),mysql认为简单地扫描整个表读取磁盘更有效率按顺序页面,而不是使用随机顺序跳转磁盘页面的索引。

您可以尝试使用此查询,这可能会使用索引:

where email_address between 'a' and 'az'

尽管进行全扫描实际上可能会更快。