有时没有使用MySQL索引

时间:2017-08-09 13:35:52

标签: mysql percona

我有一个包含150k行数据的表格,我的列号为UNIQUE INDEX,其类型为VARCHAR(10),并存储了10位数的帐号。

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

SELECT * FROM table WHERE account_number LIKE '0103%'

结果是30,000+ ROWS,当我在查询中运行EXPLAIN时它显示没有使用INDEX。

但是当我这样做时:

SELECT * FROM table WHERE account_number LIKE '0104%'

使用INDEX会产生4,000多条ROWS。

任何人都可以解释这个吗?

I'm using MySQL 5.7 Percona XtraDB.

3 个答案:

答案 0 :(得分:3)

30k + / 150k> 20%,我猜表格扫描速度更快。来自8.2.1.19 Avoiding Full Table Scans

  

MySQL使用全表扫描来解析查询时,EXPLAIN的输出在类型列中显示ALL。这通常在以下条件下发生:

     

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

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

SELECT account_number FROM table WHERE account_number LIKE '0103%'

而不是SELECT *。那么你的索引将成为覆盖索引,优化器应该总是使用它(只要WHERE条件是SARGable)。

答案 1 :(得分:1)

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

基准:

SELECT * FROM table FORCE INDEX(table_index) WHERE account_number LIKE '0103%'  

看看谁更聪明:-)你总是可以尝试质疑优化器。这是什么索引提示... ... https://dev.mysql.com/doc/refman/5.7/en/index-hints.html

答案 2 :(得分:1)

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

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

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

在某些情况下,如果必须使用,可以使用全文索引。

如果您需要有关优化查询和表格的帮助。向我们提供您想要从表中获取的更多信息和信息。