Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 我在int字段上的SQL索引无效_Mysql_Sql_Indexing_Rds - Fatal编程技术网

Mysql 我在int字段上的SQL索引无效

Mysql 我在int字段上的SQL索引无效,mysql,sql,indexing,rds,Mysql,Sql,Indexing,Rds,我有一个在int列上有索引的表 Create table sample( col1 varchar, col2 int) Create index idx1 on sample(col2); 当我解释下面的问题时 Select * from sample where col2>2; 它进行全表扫描 为什么索引在这里不起作用 当表中有大约2000万条记录时,我如何优化这些查询?仅仅因为您创建了一个索引,并不意味着MySQL将始终使用它。根据,以下是它选择对索引使用完整表扫描的几个原因:

我有一个在int列上有索引的表

Create table sample(
col1 varchar,
col2 int)

Create index idx1 on sample(col2);
当我解释下面的问题时

Select * from sample where col2>2;
它进行全表扫描

为什么索引在这里不起作用


当表中有大约2000万条记录时,我如何优化这些查询?

仅仅因为您创建了一个索引,并不意味着MySQL将始终使用它。根据,以下是它选择对索引使用完整表扫描的几个原因:

表太小了,执行表扫描比查找键要快。这对于行数少于10行且行长较短的表很常见

对于索引列,ON或WHERE子句中没有可用的限制

您正在将索引列与常量值进行比较,MySQL根据索引树计算得出,常量覆盖了表中过大的一部分,表扫描会更快。见第8.2.1.1节,“其中条款优化”

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

您可以使用forceindex来确保查询使用索引,而不是让优化器确定适当的路径,尽管MySQL通常会采用最有效的方法

SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;

引用:

仅仅因为您创建了一个索引,并不意味着MySQL将始终使用它。根据,以下是它选择对索引使用完整表扫描的几个原因:

表太小了,执行表扫描比查找键要快。这对于行数少于10行且行长较短的表很常见

对于索引列,ON或WHERE子句中没有可用的限制

您正在将索引列与常量值进行比较,MySQL根据索引树计算得出,常量覆盖了表中过大的一部分,表扫描会更快。见第8.2.1.1节,“其中条款优化”

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

您可以使用forceindex来确保查询使用索引,而不是让优化器确定适当的路径,尽管MySQL通常会采用最有效的方法

SELECT * FROM t1, t2 FORCE INDEX (index_for_column) WHERE t1.col_name=t2.col_name;

参考:

如果col2中的f值范围大多为正值,则限制>2将包括表的大部分,因此直接进行表扫描会更快,这将最大限度地减少光盘访问。否则,它将不得不从光盘中读取索引页,然后对于所选的每个条目,返回光盘以从表中获取实际行。存储数据的基数在索引的运行方式中起作用。在您的示例中,col2是唯一的字段吗?主键?值可以为空吗?我的实际用例是date存储为int.,例如20191210,12月10日。我想取过去5天的记录。所以我的查询是'where date>20191205'@anuchadal,这是一个设计缺陷。日期是日期,不是数字,不是整数,不是字符串。请为作业日期使用正确的类型。服务器仍然可能决定扫描速度更快,例如,如果您过去的数据太少,或者如果实际查询阻止它使用index@anuchadal顺便说一句,使用这样的整数进行日期运算是不可能的。20191203-5天的结果是什么?另一个可能的问题是,在列上应用任何函数,都会阻止服务器使用覆盖该列的任何索引。数据库服务器也有特定的与日期相关的优化,如果您使用不相关的类型,如字符串或整数,则会丢失这些优化。如果col2中的f值范围大多为正值,则限制>2将包括大多数表,因此直接进行表扫描会更快,这将最大限度地减少磁盘访问。否则,它将不得不从光盘中读取索引页,然后对于所选的每个条目,返回光盘以从表中获取实际行。存储数据的基数在索引的运行方式中起作用。在您的示例中,col2是唯一的字段吗?主键?值可以为空吗?我的实际用例是date存储为int.,例如20191210,12月10日。我想取过去5天的记录。所以我的查询是'where date>20191205'@anuchadal,这是一个设计缺陷。日期是日期,不是数字,不是整数,不是字符串。请为作业日期使用正确的类型。服务器仍然可能决定扫描速度更快,例如,如果您过去的数据太少,或者如果实际查询阻止它使用index@anuchadal顺便说一句,使用这样的整数进行日期运算是不可能的。20191203-5天的结果是什么?另一个警察
问题是,在列上应用任何函数,都会阻止服务器使用覆盖该列的任何索引。数据库服务器也有特定的与日期相关的优化,如果您仅仅因为创建索引而使用不相关的类型(如字符串或整数),这些优化就会丢失,但这并不意味着MySQL将始终使用它——是的,这相当于它的总和+1仅仅因为您创建了一个索引,并不意味着MySQL将始终使用它-是的,这几乎就是它的总和+1.