想象一个
MySQL
表,其中一个字段 id
包含从数字 1 到 10 亿的 10 亿行。
当我执行这样的查询时
SELECT * FROM table WHERE id > 2000 AND id < 5000;
很明显,
id
上的索引将提高该查询的性能。
但是,这样的索引也有助于模数运算,如以下查询中所示
SELECT * FROM table WHERE (id % 4) = 0;
使用模数时使用索引有帮助吗?
没有。
索引中使用的列上的函数(几乎)总是会阻止索引的使用。即使这不是真的,优化器也可能决定不使用索引。仅获取四分之一的记录可能不够选择性,因此索引不值得。
例如,在 Oracle DB 中,您可以根据您的目的定义所谓的“基于函数的索引”,在索引中定义模函数。但我很确定 MySQL 不存在基于函数的索引。 您
可以做的解决方法是添加一个附加列,用于存储模函数的结果。您必须修改插入脚本来填充它以供将来插入并更新现有数据集。然后您可以向该列添加索引并在 where 子句中使用它。