MySQL索引|与LIKE一起使用
我有一张桌子,上面写着“abcd” 内容如下: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使用了。它将评
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可能会选择这两种方案
- 不正确的统计数据可能会导致索引在本应使用的情况下不被使用
- 如果表中有两个以上的列,而只有几行,那么不使用索引可能会更便宜,因为无论如何都必须扫描所有的行(对于int类型的列,没有对LIKE进行优化)。当您进行完整扫描并让
时,使用索引没有什么好处(顺便说一句,这是一种不好的做法)选择*
联机查看:如果您的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。它们的成本非常高。别误会,它们不全是坏的,但运行起来可能非常昂贵。