MySQL 索引有时不被使用
MySQL Index sometimes not being used
我有一个包含 150k 行数据的 table,我有一个包含 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%'
结果超过 4,000 行,使用了 INDEX。
谁能解释一下?
I'm using MySQL 5.7 Percona XtraDB.
30k+/150k > 20% 我想 table 扫描会更快。来自 8.2.1.19 Avoiding Full Table Scans:
The output from EXPLAIN shows ALL in the type column when MySQL uses a full table scan to resolve a query. This usually happens under the following conditions:
You are using a key with low cardinality (many rows match the key value) through another column. In this case, MySQL assumes that by using the key it probably will do many key lookups and that a table scan would be faster.
如果您不需要所有值,请尝试使用:
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/en/index-hints.html
大多数数据库使用B树索引。在这种情况下,数据库优化器不使用索引,因为没有索引扫描速度更快。就像@lad2025 解释的那样。
您的数据库列是独一无二的,我认为您的索引基数很高。但是由于您的查询使用 like 过滤器,数据库优化器决定您选择不使用索引。
你可以试试force index看看结果。您使用具有唯一索引的 varchar。我会选择另一种数据类型或更改您的索引类型。如果您的 table 只包含数字,请将其更改为数字。这将有助于优化您的查询。
在某些情况下,当您必须使用 like 时,您可以使用全文索引。
如果您在优化查询方面需要帮助,table。向我们提供更多信息以及您想从 table.
中获取哪些信息
我有一个包含 150k 行数据的 table,我有一个包含 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%'
结果超过 4,000 行,使用了 INDEX。
谁能解释一下?
I'm using MySQL 5.7 Percona XtraDB.
30k+/150k > 20% 我想 table 扫描会更快。来自 8.2.1.19 Avoiding Full Table Scans:
The output from EXPLAIN shows ALL in the type column when MySQL uses a full table scan to resolve a query. This usually happens under the following conditions:
You are using a key with low cardinality (many rows match the key value) through another column. In this case, MySQL assumes that by using the key it probably will do many key lookups and that a table scan would be faster.
如果您不需要所有值,请尝试使用:
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/en/index-hints.html
大多数数据库使用B树索引。在这种情况下,数据库优化器不使用索引,因为没有索引扫描速度更快。就像@lad2025 解释的那样。
您的数据库列是独一无二的,我认为您的索引基数很高。但是由于您的查询使用 like 过滤器,数据库优化器决定您选择不使用索引。
你可以试试force index看看结果。您使用具有唯一索引的 varchar。我会选择另一种数据类型或更改您的索引类型。如果您的 table 只包含数字,请将其更改为数字。这将有助于优化您的查询。
在某些情况下,当您必须使用 like 时,您可以使用全文索引。
如果您在优化查询方面需要帮助,table。向我们提供更多信息以及您想从 table.
中获取哪些信息