MySQL 取余%运算如何优化?

SELECT user_id, id
FROM user_detail
WHERE id % 10 = 3
ORDER BY updated_at ASC
LIMIT 10

id 取余运算,在运算符前面,无法使用索引,请问有什么好的优化办法?

阅读 7.7k
2 个回答

这种运算无法走索引,数据量小还可以,如果数据量大了是否可以这样做:

第一步:查询出所有id

select id from user_detail

第二步:使用代码在内存计算出id % 10 = 3的满足条件的id集合

List<Integer> ids = allIds.stream().filter(id -> id % 10 == 3).collect(Collectors.toList());

第三步:使用in进行查询(如果上一步ids量太大,也可以考虑分批查询)。

SELECT user_id, id
FROM user_detail
WHERE id in (${此处应该使用foreach})
ORDER BY updated_at
ASC LIMIT 10

虽然访问了2次数据库,但是这样两步都会走id索引,应该会比之前更快。

运算无法走索引的,除非你把取余后的数存到字段里,建一个索引

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题