Mysql 使用模运算时索引是否会提高性能?

Mysql 使用模运算时索引是否会提高性能?,mysql,sql,indexing,Mysql,Sql,Indexing,设想一个MySQL表,其中一个字段id包含从数字1到10亿的10亿行 当我做这样的查询时 SELECT * FROM table WHERE id > 2000 AND id < 5000; 使用模运算时使用索引是否有帮助?否 索引中使用的列上的函数(几乎)总是阻止使用索引。即使这不是真的,优化器也可能决定不使用索引。仅从四条记录中提取一条记录可能不够有选择性,索引不值得使用。例如,在Oracle DB中,您可以定义所谓的基于函数的索引,以便在索引中定义模函数。但我很确定MySQL

设想一个
MySQL
表,其中一个字段
id
包含从数字1到10亿的10亿行

当我做这样的查询时

SELECT * FROM table WHERE id > 2000 AND id < 5000;
使用模运算时使用索引是否有帮助?


索引中使用的列上的函数(几乎)总是阻止使用索引。即使这不是真的,优化器也可能决定不使用索引。仅从四条记录中提取一条记录可能不够有选择性,索引不值得使用。

例如,在Oracle DB中,您可以定义所谓的基于函数的索引,以便在索引中定义模函数。但我很确定MySQL中不存在基于函数的索引


作为一种解决方法,您可以添加一个附加列,用于存储模函数的结果。您必须修改插入脚本,为将来的插入填充脚本,并更新现有数据集。然后,您可以在该列中添加一个索引,并在where子句中使用它。

@Isaiah:您的意思是在最后一个示例中它会有所帮助吗?我自己也不确定,但我很难弄清楚像BTREE索引这样的东西是如何进行的,以及如何使用一个模来做一些事情:只有实际值被保存,对吧,所以没有关于模的“知识”:它通常需要一个表扫描。虽然不完全确定。我认为它仍然会对所有记录进行表扫描。那么你是说,当你对有索引的列和没有索引的列使用模时,性能是一样的?我没有得到答案。首先,你说不,然后你在第一句话中说完全相反的话。所以不是我就是你误解了这个问题:请帮帮我。@Luke。它用两种不同的方式表达同一件事。函数的使用可能会阻止索引的使用。选择25%的记录可能太多,无法有效地使用索引。如果英语不是你的第一语言,查一下“排除”——这意味着没有使用索引。
SELECT * FROM table WHERE (id % 4) = 0;