想象一个MySQL
表,其中一个字段id
包含从1到10亿的10亿行。
当我像这样进行查询时
SELECT * FROM table WHERE id > 2000 AND id < 5000;
很明显,id
上的索引会提高该查询的效果。
但是,这样的索引也有助于模数,如下面的查询
SELECT * FROM table WHERE (id % 4) = 0;
使用modulo时使用索引是否有帮助?
答案 0 :(得分:4)
没有
索引中使用的列上的函数(几乎)总是排除索引的使用。即使这不是真的,优化器也可能决定不使用索引。仅提取四分之一的记录可能不足以使索引值得。
答案 1 :(得分:2)
在Oracle DB中,您可以定义所谓的基于函数的索引,以便在索引中定义模数函数。但我很确定MySQL不存在基于函数的索引。
可以执行的操作作为一种解决方法添加额外的列,您可以在其中存储模数函数的结果。您必须修改插入脚本,以便将来插入并更新现有数据集。然后,您可以向该列添加索引并在where子句中使用它。