0

我有一张桌子说“abcd”

内容如下

ID | email       | 

24 | abcd@g.com  | 
23 | asdsa@gm.com|
32 |asd@ggm.com  |

现在,我在(ID,电子邮件)上创建了一个索引

当我执行查询时, EXPLAIN SELECT * FROM abcd WHERE ID='23'; 我可以看到正在使用该索引。

但是,当我将查询更改为 EXPLAIN SELECT * FROM abcd WHERE ID LIKE '2%';

该索引不再被使用

为什么会这样?不应该在这两种情况下都使用索引吗?

谢谢

4

2 回答 2

3

MySQL 使用基于成本的优化器。它将评估使用索引的成本与不使用索引的成本。

  • 如果您的表只有三行,则是否使用索引几乎没有什么区别,因此 MySQL 可以选择任一计划。
  • 不正确的统计数据可能会导致本应使用的索引不被使用。
  • 如果您的表中有两列以上并且只有几行,那么不使用索引可能会更便宜,因为无论如何都必须扫描所有行(对于 int 类型的列没有 LIKE 优化)。当您进行完全扫描并拥有时,使用索引几乎没有优势SELECT *(顺便说一句,这是一种不好的做法)。

话虽如此,我无法重现您的结果。当我尝试您的查询时,MySQL 总是使用索引。

在线查看:sqlfiddle

于 2012-06-08T06:45:38.880 回答
3

如果你的 ID 是整数类型,它的索引不会像字符串索引那样工作:它不会在内部使用十进制数字,而是使用固定长度的二进制表示

想一想:“2%”必须匹配这些数字:

2
20
200
2000
...

但是对于 MySQL 引擎来说,将 '2%' 与这些表示相匹配并不是一件容易的事:

0x0002
0x0014
0x00C8
0x07D0
0x4E20
...

虽然理论上它可以在内部将“2%”模式转换为以下内容:

   ID BETWEEN   20 AND   29
OR ID BETWEEN  200 AND  299
OR ID BETWEEN 2000 AND 2999

我觉得极不可能。

于 2012-06-08T06:54:52.190 回答