0

我第一次开始深入研究索引,并第一次从用户表开始分析我们的数据库。我搜索了 SO 以找到一个类似的问题,但我猜无法很好地构建我的搜索。

我正在经历一个特定的概念,这第一次观察让我想知道 - 这些解释的区别[区别:第一个查询正在使用'a%',而第二个查询正在使用'ab%']

[表中的总行数users= 9193 ]:

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

在此处输入图像描述

(实际上匹配列 = 1240

2) explain select * from users where email_address like 'ab%';

在此处输入图像描述

(实际上匹配列 = 109

索引如下所示: 在此处输入图像描述

我的问题: 为什么在第一个查询中完全忽略了索引?mySql 是否认为不使用索引是一个更好的主意case 1?如果是,为什么?

4

2 回答 2

0

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

尝试:

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

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

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

但是在上面的查询中,您只执行“选择电子邮件地址”,优化器知道所有所需的信息都可以直接从索引中获得,因此无论 30% 规则如何,它都会使用索引。

各位高手,如有错误请指正。

于 2012-12-25T20:39:19.917 回答
0

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

你可以试试这个查询,它可能使用索引:

where email_address between 'a' and 'az'

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

于 2012-12-26T01:21:19.223 回答