MySQL索引|与LIKE一起使用

MySQL索引|与LIKE一起使用,mysql,indexing,Mysql,Indexing,我有一张桌子,上面写着“abcd” 内容如下: ID | email | 24 | abcd@g.com | 23 | asdsa@gm.com| 32 |asd@ggm.com | 现在,我已经在(ID、电子邮件)上创建了索引 当我执行查询时, 解释从abcd中选择*,其中ID='23'; 我可以看到索引正在被使用 但是,当我将查询更改为 解释从abcd中选择*,其中ID为“2%” 索引不再被使用 为什么会这样?这两种情况不都应该使用索引吗 谢谢MySQL使用了。它将评

我有一张桌子,上面写着“abcd”

内容如下:

ID | email       | 

24 | abcd@g.com  | 
23 | asdsa@gm.com|
32 |asd@ggm.com  |
现在,我已经在(ID、电子邮件)上创建了索引

当我执行查询时, 解释从abcd中选择*,其中ID='23'; 我可以看到索引正在被使用

但是,当我将查询更改为 解释从abcd中选择*,其中ID为“2%”

索引不再被使用

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

谢谢

MySQL使用了。它将评估使用该指数的成本与不使用该指数的成本

  • 如果您的表只有三行,那么无论是否使用索引,差别都很小,因此MySQL可能会选择这两种方案
  • 不正确的统计数据可能会导致索引在本应使用的情况下不被使用
  • 如果表中有两个以上的列,而只有几行,那么不使用索引可能会更便宜,因为无论如何都必须扫描所有的行(对于int类型的列,没有对LIKE进行优化)。当您进行完整扫描并让
    选择*
    时,使用索引没有什么好处(顺便说一句,这是一种不好的做法)
话虽如此,我还是无法复制你的结果。当我尝试您的查询时,MySQL总是使用索引

在线查看:

MySQL使用。它将评估使用该指数的成本与不使用该指数的成本

  • 如果您的表只有三行,那么无论是否使用索引,差别都很小,因此MySQL可能会选择这两种方案
  • 不正确的统计数据可能会导致索引在本应使用的情况下不被使用
  • 如果表中有两个以上的列,而只有几行,那么不使用索引可能会更便宜,因为无论如何都必须扫描所有的行(对于int类型的列,没有对LIKE进行优化)。当您进行完整扫描并让
    选择*
    时,使用索引没有什么好处(顺便说一句,这是一种不好的做法)
话虽如此,我还是无法复制你的结果。当我尝试您的查询时,MySQL总是使用索引


联机查看:

如果您的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

我觉得这很难理解。

如果你的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


我觉得很难理解。

你的桌子上有多少行?您可以发布解释选择的输出吗?对于第二个查询,您的意思是:
SELECT*FROM abcd WHERE ID LIKE'2%'
?ID列的类型是什么?整数还是字符串?您使用的存储引擎是什么?@MarkByers这是输出表中有多少行?您可以发布解释选择的输出吗?对于第二个查询,您的意思是:
SELECT*FROM abcd WHERE ID LIKE'2%'
?ID列的类型是什么?整数还是字符串?您使用的是什么存储引擎?@MarkByers这是我的表在moment@Anant:你说的“此刻”是什么意思?你是在暗示这很快就会改变吗?有可能在某个时候增长到10万人以上吗?这个数字会有所变化,但应该在10人左右,000@Anant:您应该使用计划使用的相同类型的数据进行优化。对少量行进行优化不会得到相同的结果。我的表在同一时间有161条记录moment@Anant:你说的“此刻”是什么意思?你是在暗示这很快就会改变吗?有可能在某个时候增长到10万人以上吗?这个数字会有所变化,但应该在10人左右,000@Anant:您应该使用计划使用的相同类型的数据进行优化。对少量行进行优化不会得到相同的结果。非常好的答案。这解释了为什么在我的一些关键生产系统中禁止使用like。它们的成本非常高。别误会,它们不全是坏的,但运行起来可能非常昂贵。回答得很好。这解释了为什么在我的一些关键生产系统中禁止使用like。它们的成本非常高。别误会,它们不全是坏的,但运行起来可能非常昂贵。