MySQL索引有时不被使用

MySQL索引有时不被使用,mysql,percona,Mysql,Percona,我有一个包含150k行数据的表,我有一个带有唯一索引的列,它有一种VARCHAR(10)类型,并存储10位帐号 现在每当我询问时,就像一个简单的问题: 从科目号为“0103%”的表中选择* 结果是30000多行,当我对查询运行解释时,它显示没有使用索引 但当我这样做的时候: 从科目号为“0104%”的表中选择* 它将生成4000多行,并使用索引 有人能解释吗 我使用的是MySQL 5.7 Percona XtraDB。30k+/150k>20%,我想做表扫描会更快。发件人: 当MySQL使用完整

我有一个包含150k行数据的表,我有一个带有
唯一索引的列
,它有一种
VARCHAR(10)
类型,并存储10位帐号

现在每当我询问时,就像一个简单的问题:

从科目号为“0103%”的表中选择*

结果是30000多行,当我对查询运行解释时,它显示没有使用索引

但当我这样做的时候:

从科目号为“0104%”的表中选择*

它将生成4000多行,并使用索引

有人能解释吗


我使用的是MySQL 5.7 Percona XtraDB。

30k+/150k>20%,我想做表扫描会更快。发件人:

当MySQL使用完整表扫描来解析查询时,EXPLAIN的输出在type列中显示ALL。这通常在以下情况下发生:

您正在通过另一列使用基数较低的键(许多行与键值匹配)在这种情况下,MySQL假设通过使用键,它可能会执行许多键查找,并且表扫描会更快。

如果不需要所有值,请尝试使用:

SELECT account_number FROM table WHERE account_number LIKE '0103%'

选择*而不是
。然后,您的索引将成为覆盖索引,优化器应该始终使用它(只要条件是可搜索的)。

30k+/150k>20%,我想进行表扫描会更快。发件人:

当MySQL使用完整表扫描来解析查询时,EXPLAIN的输出在type列中显示ALL。这通常在以下情况下发生:

您正在通过另一列使用基数较低的键(许多行与键值匹配)在这种情况下,MySQL假设通过使用键,它可能会执行许多键查找,并且表扫描会更快。

如果不需要所有值,请尝试使用:

SELECT account_number FROM table WHERE account_number LIKE '0103%'

选择*
而不是
。然后您的索引将成为覆盖索引,优化器应该始终使用它(只要条件是可搜索的)。

LAD205是正确的。数据库正在尝试进行智能优化

基准为:

SELECT * FROM table FORCE INDEX(table_index) WHERE account_number LIKE '0103%'  
看看谁更聪明:-)你可以试着询问优化器。这就是索引提示的作用……

LAD205是正确的。数据库正在尝试进行智能优化

基准为:

SELECT * FROM table FORCE INDEX(table_index) WHERE account_number LIKE '0103%'  
看看谁更聪明:-)你可以试着询问优化器。这就是索引提示的作用……

大多数数据库使用B树进行索引。在这种情况下,数据库优化器不使用索引,因为在没有索引的情况下扫描速度更快。比如@lad2025

数据库列是唯一的,我认为索引的基数很高。但是,由于查询使用like过滤器,数据库优化器决定让您选择不使用索引

可以使用try-force索引查看结果。您可以使用具有唯一索引的varchar。我会选择其他数据类型或更改索引类型。如果您的表仅包含数字,请将其更改为数字。这将有助于优化您的查询很多

在某些情况下,当您必须使用like时,您可以使用全文索引


如果您需要优化查询和表的帮助。请向我们提供更多信息以及您希望从表中获取的信息。

大多数数据库使用B树进行索引。在这种情况下,数据库优化器不使用索引,因为在没有索引的情况下扫描速度更快。比如@lad2025

数据库列是唯一的,我认为索引的基数很高。但是,由于查询使用like过滤器,数据库优化器决定让您选择不使用索引

可以使用try-force索引查看结果。您可以使用具有唯一索引的varchar。我会选择其他数据类型或更改索引类型。如果您的表仅包含数字,请将其更改为数字。这将有助于优化您的查询很多

在某些情况下,当您必须使用like时,您可以使用全文索引


如果您需要优化查询和表的帮助。请向我们提供更多信息以及您希望从表中获取的信息。

30k+/150k
>20%,我想进行表扫描会更快。为什么要使用4k行索引?但是它小于30k。
为什么4k行的索引仍然没有被使用?
vs
它会产生4000多行,使用索引。
请决定如果DB引擎知道查询何时匹配x个条目,它必须检查索引,那么为什么不直接使用它,而不是在索引使用后进行完整的表扫描!?对我来说没有任何意义,但我不确定percona是如何工作的。对不起,我使用了
元素
<30k+/150k
>20%,我想进行表扫描更快。为什么要使用4k行索引?但是它小于30k。
为什么4k行的索引仍然没有被使用?
vs
它会产生4000多行,使用索引。
请决定如果DB引擎知道查询何时匹配x个条目,它必须检查索引,那么为什么不直接使用它,而不是在索引使用后进行完整的表扫描!?对我来说没有任何意义,但我不确定percona是如何工作的。对不起,我使用了
谢谢,我也这么认为,索引也显示在可能的_键上,但没有使用,我想我不应该质疑优化器。@JohnPangilinan优化器并不总是正确的。有时它会生成非常愚蠢的计划。谢谢,我也这么认为,索引也以可能的键显示,但没有使用,我想我不应该质疑优化器。@johnpanglinan优化器并非总是正确的。有时它会产生非常愚蠢的计划。