[英]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.