繁体   English   中英

有时不使用MySQL索引

[英]MySQL Index sometimes not being used

我有一个包含15万行数据的表,并且有一个带有UNIQUE INDEX列,它的类型为VARCHAR(10)并存储10位数字的帐号。

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

SELECT * FROM table WHERE account_number LIKE '0103%'

结果为30,000+行,并且当我对查询运行EXPLAIN时,表明未使用INDEX。

但是当我这样做时:

SELECT * FROM table WHERE account_number LIKE '0104%'

使用INDEX的结果是4,000+行。

有人可以解释吗?

I'm using MySQL 5.7 Percona XtraDB.

30k + / 150k> 20%,我想做表扫描会更快。 8.2.1.19开始,避免全表扫描

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

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

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

SELECT account_number FROM table WHERE account_number LIKE '0103%'

而不是SELECT * 然后,您的索引将变为覆盖索引,并且优化程序应始终使用它(只要WHERE条件为SARGable)。

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

基准测试:

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

看看谁更聪明:-)您可以随时尝试询问优化器。 这就是索引提示的用途...
https://dev.mysql.com/doc/refman/5.7/zh-CN/index-hints.html

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

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

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

在某些情况下,您必须使用全文索引。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM